我正在尝试使用从本地数据库获取的数据表来渲染 View 。查询和所有数据都以我想要的格式检查。但在获取数据之前,渲染 View ,并且我收到错误。
这是我的route.js,我希望在其中找到错误。
exports.getIndex = (req, res) {
const result = sqldb.GetSubscribers()
try{
res.render('subscribtions/index', {
moment: moment,
subs : result,
pageTitle: 'Subscribtions',
path: '/subscribtions'
})
}
catch(error)
{
console.log(error)
res.redirect(404, '../views/404.ejs');
}
};
DBcall 只是为了定位
exports.GetSubscribers = function() {
const connString = "ConnectionString";
query = "Some Long Query"
sql.open(connString, (err, con) => {
if (err) {
console.log('failed to open ' + err.message)
}
con.prepare(query, (err, ps) => {
if (err) {
console.log('Fejl - prepare: '+err.message)
return
}
con.query(query, (err, rows) => {
if (err) {
console.log('Fejl - query: '+ err.message)
return err;
}
console.log("Returning results...")
return rows;
})
})
})
}
到目前为止,我一直在尝试弄清楚如何使用 async/await 或 Promise,但没有任何运气。 你们中的任何一位聪明人都可以为我指明正确的方向吗?
最佳答案
原因可能是数据库调用是异步的,并且由于您不等待它,它将在完全获取数据之前返回呈现的 View 。
因此您需要等待对数据库的调用。假设该函数是可等待的:
exports.getIndex = async (req, res) => {
...
try {
const result = await sqldb.GetSubscribers();
}
catch(err) {
console.log('Error getting subscribers', err);
}
...
};
或者,如果该函数是 then-able:
exports.getIndex = (req, res) => {
return sqldb.GetSubscribers().then(result =>
res.render('subscribtions/index', {
moment: moment,
subs : result,
pageTitle: 'Subscribtions',
path: '/subscribtions'
})
.catch(error => {
console.log(error);
res.redirect(404, '../views/404.ejs');
}));
}
要使 GetSubscribers
函数返回 promise :
exports.GetSubscribers = () => {
const connString = 'ConnectionString';
query = 'Some Long Query';
return new Promise((resolve, reject) => {
sql.open(connString, (err, con) => {
if (err) {
console.log(`failed to open ${err.message}`);
}
con.prepare(query, (err, ps) => {
if (err) {
console.log(`Fejl - prepare: ${err.message}`);
reject();
}
con.query(query, (err, rows) => {
if (err) {
console.log(`Fejl - query: ${err.message}`);
reject(err);
}
console.log('Returning results...');
resolve(rows);
});
});
});
});
};
关于node.js - Node + Express - 在渲染之前获取 dbData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60508522/