现在绕圈2天了。 我从Azure SQL数据库获取一些数据(连接参数在sqlconfig中)
function getCategories(callback) {
var conn = new mssql.ConnectionPool(sqlconfig);
var req = new mssql.Request(conn);
console.log('in getCategories');
conn.connect((err) => {
if (err) {
console.log('Connection Error:', err);
}
req.query("Select top 3 * from Categories", (err, rs) => {
if (err) {
console.log('Select error: ', err);
} else {
callback(rs.recordsets[0]);
}
conn.close();
});
})
}
我知道数据正在正确返回,因为当我这样做时
getCategories((rs) => console.log('Get-Categories', rs));
我得到了预期的结果
我正在努力让数据集传递到视图
app.get('/categories', (req, res) => {
res.render('categories.hbs', {
pageTitle: 'Catgories',
currentYear: new Date().getFullYear(),
categories: getCategories((rs) => rs)
});
});
在类别中没有返回任何内容,因为它未定义 - 因此在调用代码时回调还没有完成运行。
如何让app.get等到getCategories完成,以便数据准备好传回视图。
答案 0 :(得分:0)
我发现这篇文章让我了解它是如何工作的 Need to keep promise result in a variable for Nodejs mssql validation
并在那里写了我自己的答案。简短版本是在Node中你必须设置变量值INSIDE回调堆栈,而不是从函数返回它以分配给变量。
fetchDataFromDB('Select top 10 * from X', (err, res)=>{myvar = res})
答案 1 :(得分:0)
如何让app.get等到getCategories完成,以便数据准备好传回视图。
您可以将“getCategories”函数设置为中间件,将结果放在请求对象上,然后可以通过视图获取。只需在操作完成后调用next(),然后渲染视图。
app.get('/categories', getCategories, (req, res) => {
res.render('categories.hbs', {
pageTitle: 'Catgories',
currentYear: new Date().getFullYear(),
categories: req.categories
});
});