如果我只调用一次代码,我将使用此代码连接到SQL Server并检索一些可以正常工作的数据。如果我打电话两次,我会收到此错误:
ConnectionError:已连接到数据库!在连接到其他数据库之前调用close。在ConnectionPool._connect
但是我在通话后关闭了conn,所以我不确定我丢失了什么。
var sql = require('mssql');
const pool = new sql.ConnectionPool({
user: 'sa',
password: 'password',
server: '192.168.1.2',
database: 'demo',
options: {
encrypt: false
}
})
var conn = pool;
module.exports.getCounter = function( query){
conn.connect().then(function (err) {
var req = new sql.Request(conn);
req.query(query).then(function (result) {
console.log(result.recordset);
return result.recordset;
conn.close();
})
.catch(function (err) {
console.log(err);
conn.close();
});
})
.catch(function (err) {
console.log(err);
})};
答案 0 :(得分:1)
这是另一种解决方法,可能对其他人有帮助。
const sql = require('mssql')
let connectionPoolConfig = {
user: 'sa',
password: 'password',
server: '192.168.1.2',
database: 'demo',
options: {
encrypt: false
}
}
let connectionPoolPromise = null
let connectionPoolObj = null
let getOrCreatePool = async () => {
if (connectionPoolObj) {
return connectionPoolObj
} else if (!connectionPoolPromise) {
connectionPoolPromise = new sql.ConnectionPool(connectionPoolConfig).connect()
}
connectionPoolObj = await connectionPoolPromise
return connectionPoolObj
}
let query = async(sql) => {
const pool = await getOrCreatePool()
return await pool.request().query(sql)
}
module.exports = {
query: query
}
这是怎么称呼
let testCallerSQL = async () => {
try {
const res = await sqlUtil.query('select * from mytable')
console.log(res.recordset)
} catch(err) {
console.log(err)
} finally {
}
}
答案 1 :(得分:0)
要在关闭连接之前返回值,因此该函数在到达该行之前终止。因此,只需将return
语句移到conn.close()
下面。之后您可能遇到的其他问题是,您可能在一次执行和完全终止之前调用了两次函数,因为这些调用是异步的。
您可能必须将getCounter函数设置为Promise,以便可以在其完成/失败之前等待再次调用它。在您的示例中,我的想法不在了:
const getCounter = () => new Promise((resolve,reject) => {
conn.connect().then(function (err) {
var req = new sql.Request(conn);
req.query(query).then(function (result) {
conn.close();
resolve(result);
})
.catch(function (err) {
conn.close();
reject(err);
});
})
})
之后您可以以getCounter().then((result) => {...})