node.js mssql javascript方法第二次调用从数据库中获取数据打印未定义

时间:2017-03-18 16:31:12

标签: javascript sql-server node.js

我使用nodejs的mssql模块遇到以下代码问题:

A)函数getAllRecords_B打印" undefined"第二次打电话给它。 (从代码中可以看出,我想要做的是:我想将连接对象传递给它,以便它可以从池中选择一个连接并使用它而不是一次又一次地创建连接。)

B)第二次getAllRecords_C函数调用表示连接已经关闭。如何克服这个问题?

    var fs = require("fs");
    var sql = require("mssql");
    var config = {  
        "server": "localhost",
        "user": "xxx",
        "password": "xxx",
        "database": "TestAutomation",
         "port": 1433 
    };

    getAllRecords_B = function (conn, quer, callback) {
        conn.connect(function (err){
            var request = new sql.Request(conn); // or: var request = connection1.request(); 
            request.query(quer, function(err, recordset) {
                //console.dir(recordset);
                callback(recordset);
            });
        });
}

function getAllRecords_C(configuration) {
  return sql.connect(configuration).then(function() {
      var retVal = new sql.Request().query('select * from USERSTATUS');
    }).catch(function(err) {
        console.log("Error1", err);
    }).catch(function(err) {
    console.log("Error2", err);
  });
}

console.log("---------------------------------");
var connection = new sql.Connection(config);

var query1 = "select * from USERSTATUS";
getAllRecords_B(connection, query1, function(recs) {
    console.log(recs);
});

getAllRecords_B(connection, query1, function(recs) {
    console.log(recs);
});

2 个答案:

答案 0 :(得分:1)

如果您想从连接池中提取,似乎应该创建一个连接池。如下所示:

var fs = require("fs");
var sql = require("mssql");
var config = {  
    "server": "localhost",
    "user": "xxx",
    "password": "xxx",
    "database": "TestAutomation",
     "port": 1433 
};

//Define records GET function.
var getAllRecords_B = (pool, quer, callback) => {
  pool.request().query(quer, (err, recordset) => {
    callback(recordset);
  });
}

//Start connection.
const pool = new sql.Connection(config, err => {
  var query = "select * from USERSTATUS";

  //Call function twice.
  getAllRecords_B(pool, query, recs => {
    console.log("query1",recs);
  });

  getAllRecords_B(pool, query, recs => {
    console.log("query2",recs);
  });
});

pool.on('error', err => {
    // ... error handler
});

在那里添加了一些ES6超棒程,让您享受。

答案 1 :(得分:0)

当他评论时,forrestmid的回答是正确的。

仅适用于从现在开始使用此代码的用户。请注意,自4月1日发布的新版本V4.0.0以来,重命名已发生变化。

https://github.com/patriksimek/node-mssql/releases/tag/v4.0.0

  

[change] Connection重命名为ConnectionPool

     

new sql.Connection(v3.3)=>新的sql.ConnectionPool(v4.0 +)

因此,如果您在4月17日之后安装此模块(默认情况下),则必须使用new sql.ConnectionPool