【发布时间】:2016-12-09 13:58:57
【问题描述】:
[这个问题很模糊,对此我深表歉意。我正在尝试通过自己回答问题来解决我的各种问题]
我正在构建一个 Node.js 应用程序,它必须以给定的时间间隔执行各种任务。这是全局脚手架(涉及用于 DB 交互的 bluebird promises 和 mongoose):
var Promise = require("bluebird");
var mongoose = require('mongoose');
mongoose.Promise = require('bluebird');
// Personal modules
var bootApp = require(...);
var doStuffA = require(...);
var doStuffB = require(...);
var doStuffC = require(...);
// running locally, but meant to be deployed at some point
mongoose.connect('mongodb://localhost:27017/myDatabase');
var db = mongoose.connection;
db.on('error', () => {
console.log("Error : lost connection !"));
process.exit(1);
});
db.once('open', () => {
bootApp() // always start by booting
.then( () => { // then start the infinite loop of events
setInterval(doStuffA, 1000*60*60); // 1x/1h
setInterval(doStuffB, 1000*60*10); // 1x/10min
setInterval(doStuffC, 1000*60*3); // 1x/3min
}).catch((e) => { // errors are handled by doStuffX(), so we should never catch anything here
console.log(e.message);
process.exit(1);
});
});
每个模块 doStuffX 都是一个返回 Promise 的函数,处理自己的错误,并且应该在某个时候完成。
整个应用程序的预期行为:
- 应用应该能够永远运行
- 应用应在给定的时间间隔内尝试
doStuffX(),无论上次是成功还是失败。 - [可选:] 收到“关闭”信号后,应用应顺利关闭,无需重试任何
doStuff。
我的问题:如何为这样的应用构建一个干净的脚手架?我可以摆脱setInterval 并改用承诺吗?我主要关心的一个问题是确保doStuffX() 的上一个实例在开始下一个实例之前完成,即使它涉及以某种方式“杀死”它。
我对任何关于脚手架应用程序的链接持开放态度,但请不要给我一个涉及快递的答案/链接:我不需要快递,因为我的应用程序没有收到任何请求。 (到目前为止,我发现的所有内容都以 Express 开头:/)
【问题讨论】:
-
你为什么要摆脱
setInterval()?您需要一个计时器来执行重复的函数调用。setInterval()使用 Promise 是无法替代的,因为两者是完全不同的动物,所以整个请求听起来都是错误的。 -
你的脚手架有什么问题?看起来它会工作得很好。
-
当您希望它永远运行时,您确定要在任何数据库错误时退出该进程吗?您不应该记录错误并查看错误类型来决定合适的操作吗?
-
使用
setInterval对我来说感觉不安全,因为每个新调用都会发送一个 Promise,而我从不控制它的结果。但我不知道如何承诺这段代码...... -
@jfriend00 :哎呀,是的,每当出现问题时都必须重新连接到数据库。正在努力。
标签: node.js mongoose promise bluebird scaffolding