快速路线中的自定义事件监听器

时间:2013-03-19 13:59:03

标签: node.js events javascript-events express

在快速路由中处理自定义事件侦听器的最佳方法是什么。

我可能做错了,但这就是我现在所拥有的:

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方法上使用回调,但我真的很想进入事件系统,但我只是想知道如何更好地处理这种情况。

1 个答案:

答案 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场景示例的惯用语。