我正在尝试使用npm mssql模块连接到mssql服务器。我收到了下面提到的错误,我尝试搜索它并且除了在GitHub上已经报告它的用户没有任何成功之外,找不到任何有用的东西。
error: uncaughtException: Cannot read property 'release' of null date=Sat Jul 15 2017 02:03:59 GMT+0000 (UTC), pid=10150, uid=1000, gid=1000, cwd=/home/ubuntu/server/gcap-server-exp, execPath=/usr/bin/nodejs, version=v6.11.1, argv=[/usr/bin/nodejs, /usr/lib/node_modules/pm2/lib/ProcessContainerFork.js], rss=70537216, heapTotal=47235072, heapUsed=35834656, external=18214141, loadavg=[0.14794921875, 0.10498046875, 0.02880859375], uptime=2206463
TypeError: Cannot read property 'release' of null
at ConnectionPool.release (/home/ubuntu/server/gcap-server-exp/node_modules/atpl-models/node_modules/mssql/lib/base.js:199:14)
at Request.tds.Request.err [as userCallback] (/home/ubuntu/server/gcap-server-exp/node_modules/atpl-models/node_modules/mssql/lib/tedious.js:892:25)
at Request._this.callback (/home/ubuntu/server/gcap-server-exp/node_modules/atpl-models/node_modules/tedious/lib/request.js:47:27)
at Connection.message (/home/ubuntu/server/gcap-server-exp/node_modules/atpl-models/node_modules/tedious/lib/connection.js:1401:27)
at Connection.dispatchEvent (/home/ubuntu/server/gcap-server-exp/node_modules/atpl-models/node_modules/tedious/lib/connection.js:687:45)
at MessageIO.<anonymous> (/home/ubuntu/server/gcap-server-exp/node_modules/atpl-models/node_modules/tedious/lib/connection.js:602:18)
at emitNone (events.js:86:13)
at MessageIO.emit (events.js:185:7)
at ReadablePacketStream.<anonymous> (/home/ubuntu/server/gcap-server-exp/node_modules/atpl-models/node_modules/tedious/lib/message-io.js:102:16)
at emitOne (events.js:96:13)
我创建连接和执行过程的代码如下 -
sql.close()
sql.connect(sqlConfig).then(pool => {
return pool.request()
.input('input', sql.NVarChar, input_value)
.execute('someProcedure').then(result => {
result.recordsets.forEach(record => {
record.forEach(recordChild => {
// Do something about the recordChild ...
})
})
}, err => {
// Log err
console.log(err)
}).catch(err => {
// ... error checks
console.log(err)
})
})
上面的sqlConfig
参数是 -
sqlConfig = {
user: 'username',
password: '******',
server: 'xxx.xxx.xxx.xxx',
database: 'database',
pool: {
max: 10,
min: 0,
idleTimeoutMillis: 30000
}
}
答案 0 :(得分:1)
我遇到了同样的问题,这就是我必须做的就是避免错误。
这是我的函数,它获取与数据库的连接:
async function connectToDb() {
const pool = await new sql.ConnectionPool(connectionConfig).connect();
return pool;
}
以下是执行查询的函数:
async function someDatabaseFunction(args, done) {
let pool;
let ps;
try {
pool = await connectToDb();
ps = new sql.PreparedStatement(pool);
ps.input('input1', sql.VarChar(10));
const sqlStr = 'my query goes here';
await ps.prepare(sqlStr);
const result = await ps.execute({ groupId: args.groupId, status: args.status });
done(null, result);
} catch (error) {
done(error);
} finally {
if (ps) await ps.unprepare();
if (pool) pool.close();
}
}
对我来说,问题是在finally块中我调用ps.unprepare()
但没有await
这个函数。我正好去pool.close()
函数。 await
ps.unprepare
为我摆脱了错误。
我不确定它是否适用于您的情况,但可以,因为您在sql.close()
之前调用了sql.connect
。可能是您在空值上调用sql.close
,这就是结果错误。