查询SQL Server的NodeJs连接错误

时间:2018-07-20 22:19:04

标签: sql-server node.js

如果我只调用一次代码,我将使用此代码连接到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);

})};

2 个答案:

答案 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) => {...})

的形式调用函数