NodeJS和SQL Server连接错误

时间:2017-08-25 04:27:43

标签: sql-server node.js

我使用NodeJS连接SQL Server。我的初始代码是:

const poolA = new sql.ConnectionPool(config, err => {
         poolA.request()
            .query("select * from AnyTable", function(err, result) {
                if (err)
                    message = "Error!";
                else {                        
                    //Do something else
                    message = "Done!";
                }
            })
    });

我得到"连接已关闭错误"。我包括

poolA.close() 

它也没有解决问题。

我将其更改为:

new sql.ConnectionPool(config).then(pool => {
        pool.request()
            .query("select * from AnyTable")
    }).then(result => {
        //Do something else
        message = "Done!";
        sql.close();
    }).catch(err => {
        message = "Error!";
        sql.close();
    });

现在我得到了#34;然后我就不是一个功能"错误。

正确的方法是什么:

  1. 创建连接(如果它不存在)
  2. 如果已存在连接,请使用
  3. 我遇到各种各样的错误。有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

如果您正在使用节点,那么您应该使用承诺,就像您在第二个选项中所做的那样。所以正确的方法应该如下 -

sql.close()
   sql.connect(sqlConfig).then(pool => {
     pool.request()
     .input('param1', sql.Int, valueParam1)
     .input('param2', sql.Int, valueParam2)
     .execute(procedureToExecute).then(result => {
      // Do whatever you want with the result.
})

请记住,只有当你从承诺中归还任何东西时才能进行链接。在您的情况下,您没有返回连接池或承诺中的任何内容,因此".then is not a function" error.因此,如果您想再次使用池,则应返回池,如果要在结果中使用结果,则返回结果一部分。

其次,更好的选择是创建一次连接,然后在任何地方使用它。这个概念与MongoDB ConnectionPooling非常类似,请查看详细信息。为此,请创建一个db.js文件,如下所示 -

'use strict'

const config = require(__dirname + '/index.js')
, mssql = require('mssql')
, sqlConfig = {
, user: config.databaseUsername
, password: config.databasePassword
, server: config.databaseHost
, database: config.database.database
pool: {
    max: 10,
    min: 0,
    idleTimeoutMillis: 30000
  }
} 

let connection = mssql.connect(sqlConfig,err => {
  if (err)
   {throw err}
})

module.exports = connection

然后在您的服务器文件或任何您想要使用连接的模块中连接(要求)上述内容 -

 db = require(process.cwd() + '/config/db.js')

您可以将此包含在请求选项中,如下所示 -

let options = {db:db}
request.options = options

希望这会有所帮助,如果您需要帮助,请与我联系。

答案 1 :(得分:0)

我没有对它进行测试,但是查看您的代码,您并未向第二个然后()返回任何承诺,因此您将遇到此问题错误 .then不是函数

尝试在第一个然后()中添加返回

new sql
    .ConnectionPool(config)
    .then(pool => {
        return pool
        .request()
        .query("select * from AnyTable")
    })
    .then(result => {
        //Do something else
        message = "Done!";
        sql.close();
    })
    .catch(err => {
        message = "Error!";
        sql.close();
    });