提问者:小点点

异步等待不在express nodejs中顺序执行函数


我想要运行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);
            }
        });
    }
}

共1个答案

匿名用户

您正在对不返回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中。