为什么创建一个新的乏味的连接会使我的程序无法完成?

时间:2018-08-09 16:33:19

标签: javascript promise tedious

我正在尝试用承诺简化包装繁琐的MSSQL库API,但是每当我创建一个创建新繁琐的SQL连接的新Promise时,程序就永远不会退出,并且我很难找出原因。

这是我的真实代码的精简版,其中包含导致该问题的最低要求。

const {Connection} = require('tedious');

const connect = () =>
  new Promise((resolve, reject) =>
  {
    const config = {
      userName: '----',
      password: '----',
      domain: '----',
      server: '----',
      options: {
        database: '----',
        port: 1805,
        connectTimeout: 6000,
        readOnlyIntent: true,
        rowCollectionOnRequestCompletion: true,
        encrypt: true
      }
    };
    console.log('Pre new conn');
    // const conn = new Connection(config);
    console.log('Post new conn');
    resolve('Resolved');
  });


connect()
  .then(conn => console.log(`conn: ${conn}`))
  .catch(error => console.log(`Err: ${error}`));

连接成功后,我得到以下输出: Pre new conn Post new conn conn: Resolved 如果我取消注释行const conn = new Connection(config);的注释,则会得到完全相同的输出,但是该程序永远不会退出!

我正在使用乏味的v2.6.4,并且正在使用节点v8.11.3运行该程序。

1 个答案:

答案 0 :(得分:2)

Node.js跟踪开放的网络连接,运行计时器以及类似的事情,这可能表明您的node.js程序尚未完成其尝试执行的工作,并且发现计数为非零时,它不会自动退出。如果您希望它在这种情况下退出,则有三种选择:

  1. 您可以关闭不再使用的连接。
  2. 您可以在这些连接上调用.unref(),以将它们从count.js保留的计数中删除。如果是诸如数据库连接之类的更高级别的事情,则可能需要在实际套接字本身上调用.unref()(数据库接口可能会或可能不会为您提供),或者数据库共享它自己的{{1 }}方法。
  3. 当您要完成所有操作时,可以使用.unref()手动退出过程。