在Node js中执行下一条语句之前,请等待回调完成



NodeJ的新增功能。我在同步方法执行时遇到问题。这就是我的意思,我有一个控制器,负责:a.调用一个方法(在单独的JS文件中(打开数据库连接并检索数据。b.然后它将数据发送到前端。从我的调试工作来看,我似乎是在打开连接并获取数据的方法完成之前发送数据。我之所以知道这一点,是因为当salesControlle.js的最后一行执行时,会出现错误"Cannot read property"recordsets"of undefined"。在下面的代码片段中,dbAccess.js有一个打开数据库并获取数据的方法。salesControlle.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

至于如何处理,您需要使用回调或promise,因为连接到数据库和进行数据库查询都是非阻塞异步操作。

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);
});
});
}
}

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, (err, recordSet) => {
if (err) console.error(err);
else res.send(recordSet.recordsets[0]);
});
});
module.exports = router;

最新更新