3

node.js で mssql を使用して、SQL サーバー db に接続しています。接続コードを 1 つのクエリ パラメータを持つ関数にラップすることで、コードを削減しようとしています。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)

});

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 に答える