asyn c await не выполняет функции последовательно в express nodejs - PullRequest
1 голос
/ 20 июня 2020

Я хочу выполнить 3 запроса к базе данных, а затем отобразить 3 объекта результатов для просмотра, поэтому я использовал asyn c 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);
            }
        });
    }
}

1 Ответ

2 голосов
/ 20 июня 2020

Вы используете 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();
              }
           });
        });
        
    }
}

В вашем express -handler вы можете просто await вызвать эту функцию без передачи обратного вызова :

const getPromoteInfo = await propertyModel.getPromoteInfo();

Обратите внимание, что вы можете проверить, поддерживает ли ваш db -клиент / библиотека "из коробки" обещания - тогда вам не придется вручную заключать свои функции в обещание.

...