我使用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;然后我就不是一个功能"错误。
正确的方法是什么:
我遇到各种各样的错误。有人可以帮我解决这个问题吗?
答案 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();
});