【问题标题】:sqlite3 database: TypeError: Cannot read property of undefinedsqlite3 数据库:TypeError:无法读取未定义的属性
【发布时间】:2018-12-11 20:25:47
【问题描述】:

我有一个 Node.js 脚本曾经可以工作,但在我切换到另一个 VM 后,它就不再工作了。任何人都可以看到问题是什么?这里是函数,db是一个数据库:

this.start = function() {
  logger.debug('Starting up.');
  db.serialize(() => {
    db.run("DELETE FROM jobs WHERE status = 'failed'")
      .run("UPDATE jobs SET status = 'queued'", (err) => {
        if (err) {
          logger.error(err.message);
        } else {
          logger.info('done');
        }
      });
  });
}

现在我收到以下错误:

TypeError: Cannot read property 'run' of undefined
 at Database.db.serialize ()
 at TransactionDatabase.serialize
 at module.exports.start
 at Object.<anonymous>
...

错误指向第二个“.run”。

我的 Node.js 版本是 10.4.1,sqlite3 版本是 3.8.2。

我错过了什么?某个模块?

【问题讨论】:

  • 哪个.run 抛出错误?序列化查询时可能无法链接
  • 这是第二个 .run。我认为在另一个系统上这个脚本有效。最后,我重新编写了脚本以摆脱链接。现在可以工作,但很遗憾不知道问题出在哪里。

标签: javascript node.js sqlite


【解决方案1】:

我想我找到了答案。链接run() 几乎同时运行查询。根据this answer,函数run()启动查询,但立即返回。

但是,如果你序列化链,这两个方法不能同时使用。您正在尝试按顺序运行查询,但也要同时运行。

不过,根据您的需要,您可以嵌套序列化、并行化或回调,如 in the "control flow" doc 所示。

我猜serialize() 的方法是通过将run() 的返回值更改为undefined 来“锁定”链接。

【讨论】:

  • 感谢您的回复,很遗憾,我无法确认这是否正确,但可能对其他人有用!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多