错误:“SQL 错误:参数太多”"/>
如何解决这个错误:“SQL 错误:参数太多”
我有一个通过 Firebase Functions 的 API。当使用邮递员向带有正文{“name”:“1234”}的API发送请求时。我收到错误 401“SQL:错误:参数太多”
这是我的功能: index.js
const functions = require("firebase-functions");
const mysqlx = require("@mysql/xdevapi");
exports.getUser = functions.https.onRequest(async (req, res) => {
const name = req.body.name;
functions.logger.info("name: ", name);
functions.logger.info("name type: ", typeof name);
try {
const session = await mysqlx.getSession({
user: "user",
password: "secretpassword",
host: "hostname",
schema: "database",
port: 33060,
});
session.sql("USE database").execute().then(() => {
const sql = "SELECT * FROM database.users WHERE user_name = ?";
session.sql(sql).bind(1, name).execute()
.then((result) => {
res.status(200).send("User gathered: " + result);
}).catch((err) => {
functions.logger.info("sql statement: ", sql);
functions.logger.error("err: ", err);
res.status(401).send("SQL : " + err);
});
}).catch((err) => {
functions.logger.error("err: ", err);
res.status(402).send("Session Error:" + err);
});
} catch (error) {
functions.logger.error("error: ", error);
res.status(500)
.send("An error occurred while fetching data from the database: " + error);
}
});
我尝试通过将
user_name
设置为 user_name = ?
和 user_name = :name
来绑定变量。在尝试绑定时将 user_name
设置为 ?
会在所有情况下导致超时,除了我包含的代码块中的那个。将 user_name
设置为 :name
在所有情况下都会导致我的问题中指定的错误。我试过使用所有这些方法进行绑定:
.bind("name": name)
.bind(name)
.bind([name])
我的预期结果是 user_name 列与输入名称匹配的行的响应。从那里我计划从用户行中提取数据,我没有包含其中的代码。
我在整个代码中有多个记录器,这些是记录的值:
日志:functions.logger.info("name: ", name);
name: 1234
日志:functions.logger.info("name type: ", typeof name);
name type: string
日志:functions.logger.info("sql statement: ", sql);
sql statement: SELECT * FROM database.users WHERE user_name = ?
日志:functions.logger.error("err: ", err);
err: Error: Too many arguments
at SqlResultHandler.BaseHandler.<computed> (/workspace/node_modules/@mysql/xdevapi/lib/Protocol/InboundHandlers/BaseHandler.js:121:17)
at Array.entry (/workspace/node_modules/@mysql/xdevapi/lib/Protocol/InboundHandlers/BaseHandler.js:92:29)
at WorkQueue.process (/workspace/node_modules/@mysql/xdevapi/lib/WorkQueue.js:77:19)
at Client.handleServerMessage (/workspace/node_modules/@mysql/xdevapi/lib/Protocol/Client.js:169:21)
at Client.handleNetworkFragment (/workspace/node_modules/@mysql/xdevapi/lib/Protocol/Client.js:213:14)
at TLSSocket.<anonymous> (/workspace/node_modules/@mysql/xdevapi/lib/DevAPI/Connection.js:800:34)
at TLSSocket.emit (node:events:513:28)
at TLSSocket.emit (node:domain:552:15)
at addChunk (node:internal/streams/readable:315:12)
at readableAddChunk (node:internal/streams/readable:289:9) {
info: {
severity: 0,
code: 5015,
sqlState: 'HY000',
msg: 'Too many arguments'
}
}
回答如下:
参数个数超过了SQL语句中占位符的个数。在你的例子中,声明指定了一个占位符,你 通过
bind(1, name)
. 提供两个参数
如 X DevAPI 用户指南 中所述,命名占位符是 仅支持 CRUD 语句,而 SQL 语句仅支持普通占位符,因此,在这种情况下,
bind(name)
和 bind([name])
都应该
工作。
免责声明:我是 Node.js 的 MySQL X DevAPI 连接器的首席开发人员
更多推荐
如何解决这个错误:“SQL 错误:参数太多”
发布评论