我正在使用带有node.js的mssql连接到sql server db。我试图通过将连接代码包装在具有一个查询参数的函数中来减少代码。当我在router.get函数中调用函数时,它返回undefined。
非常感谢任何帮助。
function sqlCall(query) {
var connection = new sql.Connection(config, function(err) {
if (err) {
console.log("error1");
return;
}
var request = new sql.Request(connection); // or: var request = connection.request();
request.query(query, function(err, recordset) {
if (err) {
console.log("error2");
return;
}
return (recordset);
});
});
}

路由器代码
router.get('/', function(req, res) {
var queryString = "select * from .....";
res.json(sqlCall(queryString));
//sqlCall(queryString)
});

答案 0 :(得分:6)
您正在尝试将sqlCall
视为具有返回值的同步函数,而相反的request.query
函数是异步函数,期待回调。
由于Node.js使用非阻塞IO和回调结构进行流控制,因此使用基于回调的异步结构是可行的方法。在你的情况下,这可能是这样的:
router.get('/', function(req, res) {
var queryString = "selec * from .....";
sqlCall(queryString, function(err, data) {
if (typeof err !== "undefined" && err !== null) {
res.status(500).send({
error: err
});
return;
}
res.json(data);
});
});
您的其他组件如下所示:
function sqlCall(query, cb) {
var connection = new sql.Connection(config, function(err) {
if (typeof err !== "undefined" && err !== null) {
cb( err );
return
}
var request = new sql.Request(connection); // or: var request = connection.request();
request.query(query, function(err, recordset) {
cb( err, recordset );
});
});
}