我想运行3个数据库查询,然后渲染3个结果对象以供查看,所以我先使用async await来运行查询,但它似乎没有等待/工作,总是在运行查询之前发送空对象以供查看。找不到我出了问题的地方,我正在使用nodejs 12.16.1,不确定它的es6是否支持问题或其他。
var express = require('express');
var router = express.Router();
var reviewModel = require.main.require('./models/review-model');
var propertyModel = require.main.require('./models/property-model');
router.get('/', async function(req, res){
try{
req.cookies['username'] == null ? loginCookie = null : loginCookie = req.cookies['username'];
var getPromoteInfo = await propertyModel.getPromoteInfo(function(result){
if(result!=null) return result;
});
var getPromoteReview = await reviewModel.getPromoteReview(function(result2){
if(result2!=null) return result2;
});
var getLatest3reviews = await reviewModel.getLatest3reviews(function(result3){
if(result3!=null) return result3;
});
res.render('index', {property:getPromoteInfo, rating:getPromoteReview, testimonials:getLatest3reviews, loginCookie});
}
catch(err){console.log(err);}
});
module.exports = router;
型号代码:
var db = require('./db');
module.exports = {
getPromoteInfo: function(callback){
var sql = "select * from property where promote_status = 1;";
db.getResult(sql, null, function(result){
if(result){
callback(result);
}else{
callback(null);
}
});
}
}
答案 0 :(得分:2)
您在函数上使用await
,而该函数不会返回Promise
并导致产生undefined
值。因此,为了使async/await
工作,您可以按以下方式重写getPromoteInfo
:
var db = require('./db');
module.exports = {
getPromoteInfo: function(){
return new Promise( (resolve, reject) => {
var sql = "select * from property where promote_status = 1;";
db.getResult(sql, null, function(result){
if(result){
resolve(result);
}else{
// you can decide whether to reject or not if no records were found
reject();
}
});
});
}
}
然后,您可以在快速处理程序中简单地await
进行此函数调用,而无需传递回调:
const getPromoteInfo = await propertyModel.getPromoteInfo();
请注意,您可以检查db
-客户端/库是否支持开箱即用的诺言-这样就不必手动将函数包装在诺言中。