如何防止 Knex 挂在插入物上

How to prevent Knex from hanging on insert

我正在使用 Knex.js 将数组中的值插入到 PostgreSQL 数据库中。我一直 运行 遇到的问题是 Knex 在数据库中插入行后会挂起。

我已经为此苦苦挣扎了几个小时,并尝试了多种解决方案,包括 , , and Knex Transaction with Promises

无论我尝试哪种口味,我都会回来。我很确定我遗漏了一些明显的东西,但可能我没有喝足够的咖啡。

这是我的测试代码:

const testArray = [
  {line: 'Canterbury Tales'},
  {line: 'Moby Dick'},
  {line: 'Hamlet'}
];

const insertData = (dataArray) => {
  return new Promise( (resolve, reject) => {
    const data = dataArray.map(x => {
      return {
          file_line: x.line
      };
    });

    let insertedRows;

    db.insert(data)
      .into('file_import')  
      .then((result) => {
        insertedRows = result.rowCount;
        resolve(insertedRows);
      })
  });
}

const testCall = (b) => {
  insertData(b).then((result) => {
    console.log(`${result} rows inserted.`);
  })
}

testCall(testArray);

这个returns以下:

3 rows inserted.

编辑:更新解决方案 感谢@sigmus,我能够通过添加 db.destroy() 来实现它。这是更新后的代码块,功能齐全:

const testArray = [
  {line: 'Canterbury Tales'},
  {line: 'Moby Dick'},
  {line: 'Hamlet'}
];

const insertData = (dataArray) => {
  return new Promise( (resolve, reject) => {
    const data = dataArray.map(x => {
      return {
          file_line: x.line
      };
    });

    let insertedRows;

    db.insert(data)
      .into('file_import')  
      .then((result) => {
        insertedRows = result.rowCount;
        resolve(insertedRows);
      })
      .finally(() => {              
        db.destroy();
      });
  });
}

const testCall = (b) => {
  insertData(b).then((result) => {
    console.log(`${result} rows inserted.`);
    process.exit(0);
  })
}

testCall(testArray);

如果您在 console.log(`${result} rows inserted.`); 之后添加 process.exit(0); 脚本应该退出。

可能是连接池问题,请尝试使用 destroy,如下所述:https://knexjs.org/#Installation-pooling