[英]Node.js MSSQL package query function not returning data
我正在写我的第一个 Node.js REST API。 我使用 MS SQL 服务器作为我的数据库。 我正在使用 npm package mssql 与我的 SQL 服务器数据库一起使用。
我直接从 mssql 文档示例页面获取了下面的代码。 我只是将它包装成 function。
function getServices() {
sql
.connect(config)
.then((pool) => {
// Query
return pool
.request()
.input("SID", sql.Int, 1)
.query(
"select * from [dbo].[Services] where ServiceId = @SID"
);
})
.then((result) => {
//console.dir(result); //this has data.
return result;
})
.catch((err) => {
console.log(err);
return err;
});
}
上面的代码工作得很好,并从我的数据库中获取数据。 当我尝试将此代码转换为可以在我的快速路线上使用的 function 时,就会出现问题,如下所示。
router.get("/", (req, res, next) => {
const data = getServices();
console.log("data: ", data); //this comes back as undefined
res.status(200).json({
message: "Handling GET request from /services router.",
});
});
通过阅读文档和所有其他关于 stackoverflow 的帖子。 我正在使用.then() promise 机制,那么为什么我的“结果”没有回到我的快速路线上的 function 呢? 快速路由上的“数据”常量始终未定义。 我在这里想念什么?
重击规则:调用 function const data = getServices();
意味着这个 function 不包含任何异步工作,如 async/await/.then/.catch/Promise。
一旦 function 包含其中之一,则应始终使用上述之一调用它。
所以 #1 你必须改变
router.get("/", async (req, res, next) => {
const data = await getServices();
console.log("data: ", data); //this comes back as undefined
res.status(200).json({
message: "Handling GET request from /services router.",
});
});
然后是 function 本身
function getServices() {
try {
return sql
.connect(config)
.then((pool) => {
// Query
return pool
.request()
.input("SID", sql.Int, 1)
.query(
"select * from [dbo].[Services] where ServiceId = @SID"
);
})
.then((result) => {
//console.dir(result); //this has data.
return result;
})
} catch(ex){
return ex;
}
}
我一直在挖掘更多 SO 帖子并找到了我的工作解决方案。 更新后,工作代码发布在下面。
router.get("/", (req, res, next) => {
getServices().then((result) => {
res.status(200).json(result.recordset);
});
});
function getServices() {
return new Promise((resolve) => {
sql
.connect(config)
.then((pool) => {
// Query
return pool
.request()
.input("SID", sql.Int, 1)
.query(
"select * from [dbo].[Services] where ServiceId = @SID"
);
})
.then((result) => {
//console.dir(result);
resolve(result);
})
.catch((err) => {
console.log(err);
resolve(err);
});
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.