我想要运行3个数据库查询,然后呈现3个结果对象来查看,所以我首先使用async await来运行查询,但它似乎不是在等待/工作,总是在运行查询之前发送空对象来查看。 找不到哪里出错了,我用的是NodeJS12.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);
}
});
}
}
您正在对不返回promise
的函数使用await
,从而导致未定义
值。 因此,为了使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();
}
});
});
}
}
然后,在Express处理程序中,您可以简单地await
此函数调用,而无需传递回调:
const getPromoteInfo = await propertyModel.getPromoteInfo();
请注意,您可以检查您的db
-客户机/库是否支持开箱即用的promises,这样您就不必手动将函数包装在promise中。