NPM MSSQL - error: uncaughtException: Cannot read

2019-07-07 19:59发布

I am trying to connect to the mssql server using npm mssql module. I am getting below mentioned error, I tried to search about it and couldn't find anything helpful on it apart from few users already reported it on GitHub without any success.

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)

My code for creating a connection and executing the procedure is as follows -

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)
    })
})

The sqlConfig parameter above is -

sqlConfig = {
  user: 'username',
  password: '******',
  server: 'xxx.xxx.xxx.xxx',
  database: 'database',
  pool: {
    max: 10,
    min: 0,
    idleTimeoutMillis: 30000
  }
}

1条回答
孤傲高冷的网名
2楼-- · 2019-07-07 20:23

I was having this same issue, and here's what I had to do to avoid the error.

Here's my function that gets a connection to the database:

async function connectToDb() {
    const pool = await new sql.ConnectionPool(connectionConfig).connect();
    return pool;
}

Here's the function that does the query:

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();
    }
}

The issue for me was that in the finally block I was calling ps.unprepare() but didn't await that function. I was going right to the pool.close() function. awaiting the ps.unprepare got rid of the error for me.

I'm not exactly sure if it applies to your situation, but it could, since you have a sql.close() being called right before sql.connect. It could be that you're calling sql.close on a null value and that's the resulting error.

查看更多
登录 后发表回答