Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 等待回调完成,然后在节点js中执行下一条语句_Node.js_Callback_Synchronization - Fatal编程技术网

Node.js 等待回调完成,然后在节点js中执行下一条语句

Node.js 等待回调完成,然后在节点js中执行下一条语句,node.js,callback,synchronization,Node.js,Callback,Synchronization,NodeJs的新成员。我在同步方法执行时遇到问题。这就是我的意思,我有一个控制器,负责: A.调用方法(在单独的JS文件中)打开数据库连接并检索数据。 B然后它将数据发送到前端。 从我的调试工作来看,我似乎是在打开连接并获取数据的方法完成之前发送数据的。我之所以知道这一点,是因为当执行salesController.js的最后一行时,它会给出错误“无法读取未定义的属性”Recordset”。在下面的代码段中,dbAccess.js具有打开数据库并获取数据的方法。然后salesController

NodeJs的新成员。我在同步方法执行时遇到问题。这就是我的意思,我有一个控制器,负责: A.调用方法(在单独的JS文件中)打开数据库连接并检索数据。 B然后它将数据发送到前端。 从我的调试工作来看,我似乎是在打开连接并获取数据的方法完成之前发送数据的。我之所以知道这一点,是因为当执行salesController.js的最后一行时,它会给出错误“无法读取未定义的属性”Recordset”。在下面的代码段中,dbAccess.js具有打开数据库并获取数据的方法。然后salesController.js发送该数据。需要salesController.js中突出显示部分的帮助。请注意,如果有帮助,我将使用sql server作为后端

dbAccess.js

const dbConfig = require('../../nodeApp/dbConfig')

module.exports = {
    makeDBAccess: function(sqlString, req, res) {
        var sql = require("mssql/msnodesqlv8");
        // connect to your database
        sql.connect(dbConfig, function (err) {


            if (err) console.log(err);

            // create Request object
            var request = new sql.Request();

            // query to the database and get the records
            request.query(sqlString, function (err, recordset) {

                if (err) console.log(err)

                console.log(recordset.recordsets[0]);
                console.log(recordset.recordsets[0].length)

                return recordset;
            });
        });
    }
}
salesController.js

const express = require('express');
var router = express.Router();
var dbAccess = require('../utility/dbAccess.js')
var utility = require('../utility/readfile.js')


router.get('/totalSales2011', function (req, res) {
    var sqlString = utility.readFileFunc("queries/sales2011.sql");
    var recordSet = dbAccess.makeDBAccess(sqlString,req,res); **//Get data from database**
    res.send(recordSet.recordsets[0]); **//Wait for line above to complete before doing this.**
});

module.exports = router;

原因在javascript函数中返回
undefined
如果未添加
return
语句,则
makeDBAccess
函数不包含返回,因此它返回
undefined

至于怎么做,您需要使用or,因为连接到数据库和进行数据库查询都是异步操作

dbAccess.js

const dbConfig = require('../../nodeApp/dbConfig')

module.exports = {
    makeDBAccess: function(sqlString, callback) {
        var sql = require("mssql/msnodesqlv8");
        // connect to your database
        sql.connect(dbConfig, function (err) {


            if (err) return callback(err);

            // create Request object
            var request = new sql.Request();

            // query to the database and get the records
            request.query(sqlString, function (err, recordset) {

                if (err) return callback(err)


                return callback(null, recordset);
            });
        });
    }
}
const express = require('express');
var router = express.Router();
var dbAccess = require('../utility/dbAccess.js')
var utility = require('../utility/readfile.js')


router.get('/totalSales2011', function (req, res) {
    var sqlString = utility.readFileFunc("queries/sales2011.sql");
    var recordSet = dbAccess.makeDBAccess(sqlString, (err, recordSet) => {
          if (err) console.error(err);
          else res.send(recordSet.recordsets[0]);
    });

});

module.exports = router;

salesController.js

const dbConfig = require('../../nodeApp/dbConfig')

module.exports = {
    makeDBAccess: function(sqlString, callback) {
        var sql = require("mssql/msnodesqlv8");
        // connect to your database
        sql.connect(dbConfig, function (err) {


            if (err) return callback(err);

            // create Request object
            var request = new sql.Request();

            // query to the database and get the records
            request.query(sqlString, function (err, recordset) {

                if (err) return callback(err)


                return callback(null, recordset);
            });
        });
    }
}
const express = require('express');
var router = express.Router();
var dbAccess = require('../utility/dbAccess.js')
var utility = require('../utility/readfile.js')


router.get('/totalSales2011', function (req, res) {
    var sqlString = utility.readFileFunc("queries/sales2011.sql");
    var recordSet = dbAccess.makeDBAccess(sqlString, (err, recordSet) => {
          if (err) console.error(err);
          else res.send(recordSet.recordsets[0]);
    });

});

module.exports = router;