javascript - 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 请求在浏览器中随机“挂起”
我已经开始阅读子进程和工作线程,但这些似乎很艰巨,因为外部文件现在不在我启用 babel 的代码库之外,所以我必须在 package.json 中找出一些巫毒来获取脚本之外index.js 流经所有这些......
这是 cron 模块的预期行为吗?我在自述文件或已知问题上没有看到任何内容;我很惊讶没有其他人遇到过这种情况,这让我觉得我做错了什么——知道那可能是什么吗?
解决方案
我想出了一种使用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']);
}
我希望有第二个入口点,但不能立即确定如何做到这一点,所以这对我来说是最简单的解决方案。
推荐阅读
- python - Pandas - 将函数应用于一列以扩展到新列
- r - 如何根据应用于不同列的条件语句应用引用特定列和前导值的函数
- r - 贝叶斯网络 'catnet' 包 cnPlot 返回 null
- sql - 将星期日作为一周的第一天返回
- asp.net - OAuth2 的哑登录
- javascript - Electron js 桌面应用程序不再运行,运行某种 Electron js 默认应用程序
- kotlin - Kotlin 扩展功能 - 完成?
- python - 将患者坐标转换为 DICOM 图像的体素坐标
- python - Selecting the last element of a list inside a pandas dataframe
- spring-batch - 使用 FlatFileItemReader 读取具有名称模式的文件