Node.js npm mssql函数返回undefined

use*_*272 2 javascript callback node.js node-mssql

我正在使用带有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);
    });
  });
}
Run Code Online (Sandbox Code Playgroud)

路由器代码

router.get('/', function(req, res) {

  var queryString = "select * from .....";

  res.json(sqlCall(queryString));

  //sqlCall(queryString)

});
Run Code Online (Sandbox Code Playgroud)

Exi*_*ris 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);
  });
});
Run Code Online (Sandbox Code Playgroud)

与您的其他组件看起来像这样:

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

  });

}
Run Code Online (Sandbox Code Playgroud)