这个 mssql 是我用于 SQL Server 的库。
要做出准备好的陈述,您需要获取
PreparedStatement
对象,并且需要执行以下操作:
ps.input
ps.prepare
ps.execute
ps.unprepare
然后随时处理错误。
router.get('/debtors/', async (req, res) => {
const column = req.query.column
console.log(column)
res.send("ok")
const ps = new sql.PreparedStatement(/* [pool] */)
ps.input('param', sql.VarChar(20))
ps.prepare('select @param from debtors', err => {
ps.execute({ param: column }, (err, result) => {
console.log("Result: " + result);
ps.unprepare(err => {
})
})
})
})
这段代码来自官方文档,只是稍作调整。我使用邮递员发送的 URL 是这样的:
localhost:8687/debtors/?column=id
console.log("Result: " + result);
导致错误:
结果:未定义
我不知道为什么。
req.query.column
确实返回字符串“id”,我已将其设置为VarChar(20)
。我也尝试过四处移动@param
,看看是否有限制。
select *
from debtors
where first = @param
所以我尝试的下一件事是这个,但是
result
仍然未定义。我不知道为什么。如有任何帮助,我们将不胜感激。
感谢@siggemannen,我能够解决这个问题。看到这个错误让我思考是否分配了连接,我检查了其他人的代码并意识到在创建
PreparedStatement
时我需要从 ConnectionPool
的 mssql
函数传入 connect
对象。
所以我做了这些改变。
// db.js
var pool;
sql.connect(dbConfig).then(result => result = pool).catch(err => {
console.error("Connection issue: " + err)
console.error(err.stack)
})
module.exports = { pool, ...}
然后在我需要使用
PreparedStatement
的文件中
const { pool } = require("db");
// ... code
router.get('/debtors/', async (req, res) => {
const column = req.query.column
const ps = new sql.PreparedStatement(pool) // <--- This is the important part
ps.input('param', sql.VarChar(200))
ps.prepare('select * from debtor WHERE first = @param', err => {
console.log("ps.prepare err: " + err)
ps.execute({ param: column }, (err, result) => {
console.log("ps.execute: " + err);
res.send(result.recordset);
ps.unprepare(err => {
})
})
})
})
问题是,由于我假设回调已激活,因此意味着没有错误。结果无论是否有错误都会激活回调,并检查是否有错误。我需要检查是否
err === undefined