0

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

我可能做错了,但这是我目前所拥有的:

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

4

1 回答 1

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,两者均由同一原作者编写,并且都主要面向函数式编程和回调。虽然可以设计框架以使用事件、回调或两者/两者(可选),但在这两种特定情况下,库会强制您使用回调,因为它不为这些特定操作提供事件。这就是为什么对于这些​​特定调用的 express 和 mongoose,回调是惯用的东西。

现在看看您的示例,猫鼬确实在模型类级别发出了一些事件,但这些事件与快速请求/响应无关,因此更适合错误记录和异常处理以及基本 Web 应用程序之外的其他一些特殊用例响应渲染。

因此,当我说“不要为此用户事件绑定”时,我并不是说事件绑定永远不合适,只是考虑到您的特定代码片段,您正在使用的库既不支持它们,也不是此示例的惯用语一个基本的 make-a-db-query-and-send-back-a-web-page 场景。

于 2013-03-19T14:10:13.017 回答