在节点js中执行下一条语句之前等待回调完成
Wait for callback to finish before executing next statement in node js
NodeJ 的新手。我在同步方法执行时遇到问题。这就是我的意思,我有一个控制器负责:
一个。调用方法(在单独的 JS 文件中)打开数据库连接并检索数据。
b.然后它将数据发送到前端。
从我的调试工作来看,我似乎是在打开连接并获取数据的方法完成之前发送数据。我知道这一点,因为当 salesController.js 的最后一行执行时会出现错误“无法读取未定义的 属性 'recordsets'”。在下面的代码片段中 dbAccess.js 有打开数据库并获取数据的方法。 salesController.js 然后发送该数据。在 salesController.js 中突出显示的部分需要帮助。请注意,如果它有帮助,我正在使用 sql 服务器作为后端。
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 函数 returns undefined
如果你没有添加 return
语句,makeDBAccess
函数不包含return 所以它 returns undefined
.
至于这个怎么办,需要用到callback or promises since connecting to your database and making a database query are both non-blocking异步操作。
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;
NodeJ 的新手。我在同步方法执行时遇到问题。这就是我的意思,我有一个控制器负责: 一个。调用方法(在单独的 JS 文件中)打开数据库连接并检索数据。 b.然后它将数据发送到前端。 从我的调试工作来看,我似乎是在打开连接并获取数据的方法完成之前发送数据。我知道这一点,因为当 salesController.js 的最后一行执行时会出现错误“无法读取未定义的 属性 'recordsets'”。在下面的代码片段中 dbAccess.js 有打开数据库并获取数据的方法。 salesController.js 然后发送该数据。在 salesController.js 中突出显示的部分需要帮助。请注意,如果它有帮助,我正在使用 sql 服务器作为后端。
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 函数 returns undefined
如果你没有添加 return
语句,makeDBAccess
函数不包含return 所以它 returns undefined
.
至于这个怎么办,需要用到callback or promises since connecting to your database and making a database query are both non-blocking异步操作。
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;