如何防止Knex挂在插件上

时间:2019-07-19 19:03:12

标签: node.js knex.js

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

我已经为此苦苦挣扎了几个小时,并尝试了各种解决方案,包括Get Knex.js transactions working with ES7 async/awaitMake KnexJS Transactions work with async/awaitKnex 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);

这将返回以下内容:

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

1 个答案:

答案 0 :(得分:1)

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

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