首页 > 解决方案 > npm cron 阻止 Express.JS HTTP 请求

问题描述

我正在我的Express.js应用程序中尝试来自 npm的cron模块。

应用程序结构非常简单,我有一个连接到数据库的函数,并在其中注册了处理 HTTP 请求的所有各种模块,如下所示:

import { Router } from 'express';
export default ({ config }) => {
    let api = Router();

    connectAllDbs(config, ({mysql}) => {

        userModule({api, config, mysql});
        // other modules...
    });

    return api;
};

现在我编写了一个 cron 并在加载这些 HTTP 模块后添加它,因为它还依赖于数据库连接

const cron = new CronJob('* */30 * * *', () => {
    // do stuff w/ mysql
});
cron.start();

通过这个添加,一些对节点服务器的 HTTP 请求在浏览器中随机“挂起”

待处理的 http 请求

我已经开始阅读子进程工作线程,但这些似乎很艰巨,因为外部文件现在不在我启用 babel 的代码库之外,所以我必须在 package.json 中找出一些巫毒来获取脚本之外index.js 流经所有这些......

这是 cron 模块的预期行为吗?我在自述文件或已知问题上没有看到任何内容;我很惊讶没有其他人遇到过这种情况,这让我觉得我做错了什么——知道那可能是什么吗?

标签: javascriptexpresscron

解决方案


我想出了一种使用child_process.spawn的解决方案。

为了应对通过 npm 来利用 babel 设置而不必创建另一个入口点(scripts在 package.json 中添加条目)的需要,我在现有入口点 (index.js) 脚本中创建了一个条件块,如下所示

//--------------------------------------------------
// Run the CRON
//--------------------------------------------------
if(process.argv.includes('cron')) {
    runCron();
}
//--------------------------------------------------
// Handle HTTP requests
//--------------------------------------------------
else {
    // Start express -------------------------------
    let app = express();
    app.server = http.createServer(app);

    // Fork the cron process -----------------------
    const spawned = spawn('npm', ['run', 'cron']);
}

我希望有第二个入口点,但不能立即确定如何做到这一点,所以这对我来说是最简单的解决方案。


推荐阅读