模型中的NodeJs Express 4异步函数似乎在完成之前返回

问题描述 投票:1回答:1

我试图通过分离一些逻辑来组织我的项目。我有路由,视图,模型和控制器文件夹。

对于一个名为data(models / datamodel.js)的模型,我有两种方法来获取数据以填充下拉列表。这些方法使用sequelizer来查询一些数据异步。我在同一页面上使用续集器来解决回调和拒绝回调没有问题。但是在我的data.js中,这是一个将从get函数返回json的Web服务页面,我使用从dataModel创建的对象与.then和.catch来处理回调,但执行似乎立即跳转到解决回调。我已经尝试过各种调整结构,承诺和等待。似乎没什么用。

[模型/ dataModel.js]

'use strict';
const Sequelize = require('sequelize');

function dataModel() {

}



const sequelize = new Sequelize('compliance', 'username', 'password', {
    host: 'WIN-QFHT5FIC1UQ',
    dialect: 'mssql',
    operatorsAliases: false,
    requestTimeout: 300000,

    pool: {
        max: 5,
        min: 0,
        acquire: 30000,
        idle: 30000
    }
});
var selectTo = sequelize.define('SelectTo',
    {
        to_jid: Sequelize.CHAR(100)
    }
)
var selectFrom = sequelize.define('SelectFrom',
    {
        from_jid: Sequelize.CHAR(255)
    }
)

dataModel.prototype.getSelectTo = async function () {
    sequelize.query('SELECT To_jid from vwTo_jid_select order by to_jid', { model: selectTo }).then(selectTo => {
        return (selectTo); //<-- This returns a valid string array
    }
    ).catch(err => {
        return (err);
    });

};
dataModel.prototype.getSelectFrom = async function () {
     sequelize.query('SELECT from_jid from vwFrom_jid_select order by to_jid', { model: selectFrom })
        .then(selectFrom => {
            return (selectFrom); //<-- returns a valid string array
        }, err => {
            return (err);
        })
}
module.exports = dataModel;

[路由/ data.js]

'use strict';
var express = require('express');
var router = express.Router();
var path = require('path');
var dataModel = require('../models/dataModel.js');
var dm = new dataModel();

router.get('/:type', function (req, res) {
    switch (req.params.type) {
        case 'selectFrom':
            {

                dm.getSelectFrom().then(
                    result => function () {
                        res.json(result) //<-- code execution jumps here before the SQL Query returns
                    }).catch(err => function () {
                        res.send(err);
                    });

            };

        case 'selectTo':
            {
                dm.getSelectTo().then(
                    result => {
                        res.json(result); //<-- code execution jumps here before the SQL Query returns
                    }).catch(err =>  {
                        res.send(err);
                    });
            }
        default:
    }
});

module.exports = router;
javascript node.js express asynchronous callback
1个回答
1
投票

我怀疑你遇到了问题,因为你的异步函数实际上没有返回任何东西。只需添加return语句,看看是否有帮助:

dataModel.prototype.getSelectTo = async function () {
    // add a return here
    return sequelize.query('SELECT To_jid from vwTo_jid_select order by to_jid', { model: selectTo }).then(selectTo => {
        return (selectTo); //<-- This returns a valid string array
    }
    ).catch(err => {
        return (err);
    });

};
dataModel.prototype.getSelectFrom = async function () {
     // add a return here
     return sequelize.query('SELECT from_jid from vwFrom_jid_select order by to_jid', { model: selectFrom })
        .then(selectFrom => {
            return (selectFrom); //<-- returns a valid string array
        }, err => {
            return (err);
        })
}
© www.soinside.com 2019 - 2024. All rights reserved.