3

我正在使用带有 node.js 的 mssql 来连接到 sql server db。我试图通过将连接代码包装在一个带有一个查询参数的函数中来减少代码。当我在 router.get 函数中调用该函数时,它返回未定义。

任何帮助将非常感激。

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)

});

4

1 回答 1

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

  });

}
于 2015-01-20T09:55:09.140 回答