Javascript 模型中的nodejsexpress4异步函数似乎在完成之前返回

Javascript 模型中的nodejsexpress4异步函数似乎在完成之前返回,javascript,node.js,express,asynchronous,callback,Javascript,Node.js,Express,Asynchronous,Callback,我试图通过分离一些逻辑来组织我的项目。我有路由、视图、模型和控制器文件夹 对于名为data(models/datamodel.js)的模型,我有两种方法来获取数据以填充下拉列表。这些方法使用sequelizer异步查询某些数据。在同一页上使用sequelizer来解析回调和拒绝回调没有问题。但是,在我的data.js中,这是一个web服务页面,它将从get函数返回json,我使用从dataModel创建的带有.then和.catch的对象来处理回调,但执行似乎会立即跳转到resolve回调。我尝

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

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

[models/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;
“严格使用”;
const Sequelize=require('Sequelize');
函数数据模型(){
}
const sequelize=new sequelize('compliance'、'username'、'password'{
主持人:“WIN-QFHT5FIC1UQ”,
方言:“mssql”,
运算符别名:false,
请求超时:300000,
游泳池:{
最高:5,
分:0,,
获得:30000,
闲置:30000
}
});
var selectTo=sequelize.define('selectTo',
{
to_jid:Sequelize.CHAR(100)
}
)
var selectFrom=sequelize.define('selectFrom',
{
from_jid:Sequelize.CHAR(255)
}
)
dataModel.prototype.getSelectTo=异步函数(){
query('SELECT To_jid from vwTo_jid_SELECT order by To_jid',{model:selectTo})。然后(selectTo=>{
返回(选择至);//{
返回(err);
});
};
dataModel.prototype.getSelectFrom=异步函数(){
query('SELECT from_jid from vwFrom_jid_SELECT order by to_jid',{model:selectFrom})
。然后(选择from=>{
返回(从中选择);//{
返回(err);
})
}
module.exports=数据模型;
[routes/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;
“严格使用”;
var express=需要(“express”);
var router=express.router();
var path=require('path');
var dataModel=require('../models/dataModel.js');
var dm=新的数据模型();
路由器.get('/:type',函数(req,res){
开关(要求参数类型){
案例“selectFrom”:
{
dm.getSelectFrom()。然后(
结果=>函数(){
res.json(result)//函数(){
res.send(err);
});
};
案例“selectTo”:
{
dm.getSelectTo()。然后(
结果=>{
res.json(结果);//{
res.send(err);
});
}
违约:
}
});
module.exports=路由器;

我怀疑您遇到了问题,因为您的异步函数实际上没有返回任何内容。只需添加
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);
        })
}
dataModel.prototype.getSelectTo=async函数(){
//在这里添加一个返回
返回sequelize.query('SELECT To_jid from vwTo_jid_SELECT order by To_jid',{model:selectTo})。然后(selectTo=>{
返回(选择至);//{
返回(err);
});
};
dataModel.prototype.getSelectFrom=异步函数(){
//在这里添加一个返回
返回sequelize.query('SELECT from_jid from vwFrom_jid_SELECT order by to_jid',{model:selectFrom})
。然后(选择from=>{
返回(从中选择);//{
返回(err);
})
}

将调用放到
sequalize.query()上
try/catch
块中。我怀疑Sequalize正在抛出,但被承诺掩盖了,你看不到它。我在sequelizer查询周围添加了一个try-catch块,但我得到了相同的结果。在调试中运行时,代码执行首先跳到data.js第26行,查询运行后结果应到达该行……然后它将返回mps到dataModel.js,具有有效的查询结果且没有错误。等等-所以一切都如您所期望的那样工作,但您的调试器很古怪?您是否尝试过在其他浏览器中调试?这可能是一种简单的情况,例如在文件编辑后映射文件不稳定或其他情况。Duh…当然您很累。无论如何,如果它工作正常,则很可能出现这种情况只是你的调试器不可靠。谢谢!!!我注意到一些示例中有额外的返回,但不知道如何使用它,也不知道为什么需要它。基本上,异步函数总是返回一个
Promise
,对吗?所以如果你没有从异步函数返回任何东西,你基本上是返回
Promise
。你需要运行的任何东西之后,异步函数不会等待异步函数中的任何内容完成,除非您返回
承诺(在您的情况下是查询)您想等待。谢谢,我现在看到了它,因为它在匿名异步函数中,我需要返回。另外,您实际上不需要这些异步函数,因为您没有使用
wait
关键字。您可以将它们重构为普通函数,因为它们返回您的查询
Promise