在快速路由中处理自定义事件侦听器的最佳方法是什么。
我可能做错了,但这就是我现在所拥有的:
module.exports = {
get: function(req, res, next) {
MyModel.on('error', function(err) {
res.send(501)
})
MyModel.on('found', function() {
res.send(200)
})
MyModel.on('notFound', function() {
res.send(404)
})
MyModel.findByName(req.params.name);
}
}
我可以看到这是完全错误的,因为每个请求都会添加每个事件监听器。
开始传递响应对象以便在事件被触发时进行响应也是错误的。
我可以在findByName方法上使用回调,但我真的很想进入事件系统,但我只是想知道如何更好地处理这种情况。
答案 0 :(得分:1)
不要为此使用事件绑定,请使用回调函数:
module.exports = {
get: function(req, res, next) {
MyModel.findByName(req.params.name, function (error, model) {
if (error) {
return res.status(501).send(error);
}
if (!model) {
return res.status(404).send('Not found');
}
res.send(model.toJSON());
});
}
}
为了根据评论添加一些说明,你的例子是使用express和mongoose,两者都是由同一个原作者使用,并且主要面向功能样式编程和回调。虽然可以设计框架来使用事件,回调或两者兼有(可选),但在这两种特定情况下,库强制您使用回调,因为它不为这些特定操作提供事件。这就是为什么对于这些特殊的调用来表达和mongoose,回调就是这样的事情。
现在看一下你的例子,mongoose会在Model类级别发出一些事件,但是那些事件与快速请求/响应没有关联,因此更适合于错误记录和异常处理以及其他一些特殊用例。基本的Web应用程序响应呈现。
所以当我说“不要为此用户事件绑定”时,我并不是说事件绑定永远不合适,只是给定了特定的代码片段,它们都不受支持您正在使用的库,也不是这个基本的make-a-db-query-and-send-back-a-web-pages场景示例的惯用语。