【问题标题】:How to prevent Knex from hanging on insert如何防止 Knex 挂在刀片上
【发布时间】:2019-07-19 19:03:12
【问题描述】:

我正在使用 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);

【问题讨论】:

  • console.log(`${result} rows inserted.`); 之后添加process.exit(0); 会有帮助吗?
  • @sigmus 这确实允许应用程序结束,谢谢!但是,我想知道是否还有更好的方法?我尝试process.exitCode = 0 按照stackoverflow.com/a/37592669/1575022 自然退出,但应用程序仍然挂起。所以,process.exit(0) 感觉就像一个权宜之计。
  • 没有process.exit,是需要很长时间才能退出还是根本不退出?可能是连接池问题,尝试使用destroy,如下所述:knexjs.org/#Installation-pooling
  • @sigmus,天才!我什至没有想过要检查。如果您重新发布作为答案,我将接受并使用解决方案更新原始帖子。谢谢!
  • 作为答案重新发布,干杯。

标签: node.js knex.js


【解决方案1】:

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

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

【讨论】:

  • 谢谢,这成功了!我用你的解决方案更新了我的问题。
猜你喜欢
  • 2012-05-31
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
  • 2021-12-26
  • 2014-12-27
相关资源
最近更新 更多