【问题标题】:Make async node script run forever使异步节点脚本永远运行
【发布时间】:2021-06-04 00:13:06
【问题描述】:

我搜索了很多,但还没有找到解决我问题的具体方法。 我有一个异步函数,它作为节点脚本轮询数据库,当使用节点 12 时该脚本将永远运行,但在 v14 中,实现发生了变化,它在运行一次后立即关闭。

(async function pollDatabase() {
    const db = new Db();

    return async.forever(async function (pollFn) {
 
        const query = "SELECT * FROM templates WHERE data->>'isProcessed'='0' LIMIT 1;";
        const templates = await db.query(query);

        if (!templates || !templates.length) {
            setTimeout(pollFn, 1000);
            return;
        }

        await doSomethingWithTemplateAndReExecuteThisFunction(templates[0], pollFn);
    });
})();

奇怪的是,例如一个快速服务器只是保持运行,但我还没有弄清楚它是如何工作的。我不打算将此后台脚本转换为服务器。关于什么是让它永远作为某种后台任务运行的最佳方法的任何想法?目前它是一个只包含这个脚本的 docker 容器。

【问题讨论】:

  • 你考虑过使用PM2吗?
  • 是的,我们过去使用过它,现在只使用一个总是重启的 docker 容器,但想法是它实际上永远不会停止并且每一秒都会轮询数据库。它工作得很好,但只有在使用 Node 12 时才可以,而在使用 Node 14 时就不行了

标签: node.js typescript asynchronous task


【解决方案1】:

最后我自己解决了。我不知道为什么切换到 Node 14 会发生这种情况,但过时的 pg-promisebluebird 库的组合似乎是罪魁祸首。我想这可能与 Node 14 现在处理 Promise 的方式有关。

旧版本: pg-promise@3.2.6bluebird@2.10.2

新版本: pg-promise@^10.9.4 使用原生 Promise 实现

【讨论】:

  • 您对 Promise 的假设可能无效。但是pg-promise 版本将是相关的,因为它已更新以适应新的 NodeJS 版本。您至少应该包含您所拥有的版本详细信息,以将其视为答案。
  • 哇,这些版本来自史前时代。难怪他们没有在新的 NodeJS 中工作。
猜你喜欢
  • 2018-08-12
  • 2015-04-17
  • 2014-06-06
  • 2018-11-18
  • 1970-01-01
  • 2019-08-29
  • 1970-01-01
  • 2015-02-17
  • 1970-01-01
相关资源
最近更新 更多