【问题标题】:Proper Handling of fetch errors for Mongoose?正确处理 Mongoose 的获取错误?
【发布时间】:2012-05-15 09:00:44
【问题描述】:

这是一个纯粹的最佳实践问题。我对 Node 和 Mongoose 很陌生。我非常喜欢这项技术,并且一直在着手为我正在构建的应用程序构建一个 JSON 支持的 API 的项目。

我发现当我从数据库中获取对象时,我不断重复代码。例如:

Playlist.findById(req.params.id, function(err,playlist){
  if (err)
    return res.json({error: "Error fetching playlist"});
  else if (!playlist)
    return res.json({error: "Error finding the playlist"});

  //Actual code being performed on the playlist that I'm fetching
});

函数调用顶部的错误处理很烦人,因为每次调用数据库时我都必须重复该代码......或者我认为是这样。

我考虑过使用如下回调:

var fetchCallback = function(err,objOrDoc,callback){
  //Handle the error messages
  callback(objOrDoc);
};

但是,这种方法会打乱我的顺序流程,因为我必须在执行提取之前定义回调函数。因此,如果我有大量的数据库查询链接在一起,我将不得不以相反的顺序放置回调,这从干净编码的角度来看远非理想。

我想知道是否有人遇到过这个问题并且有任何减少重复的最佳实践。

我也在使用 express 框架,所以如果有一种有用的方法可以在 express 中处理它,我也很想知道。

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    您可以在这里尝试几种有趣的方法。

    最简单的情况是,您可以简单地拥有一个加载对象并在错误条件下处理输出的函数。

    fetchResource = function(model, req, res, callback) {
      model.findById(req.params.id, function(err, resource) {
        if (err)
          return res.json({error: "Error fetching " + model.toString()});
        else if (!playlist)
          return res.json({error: "Error finding the " + model.toString()});
    
        callback(resource);
      });
    };
    
    app.on('/playlists/1', function(req, res) {
      fetchResource(Playlist, req, res, function(playlist) {
        // code to deal with playlist.
      });
    });
    

    这仍然有很多重复,所以我可能会尝试将其移至middleware

    路由中间件

    路由可以通过向方法传递一个或多个额外的回调(或数组)来利用特定于路由的中间件。此功能对于限制访问、加载路由使用的数据等非常有用。

    现在我还没有对此进行测试,它有点手摇(阅读:伪代码),但我认为它应该作为一个体面的例子。

    // assuming a URL of '/playlist/5' or '/user/10/edit', etc.
    
    function loadResource(model) {
      return function(req, res, next) {
        model.findById(req.params.id, function(err, resource) {
          if (err)
            return res.json({error: "Error fetching " + model.toString()});
          else if (!resource)
            return res.json({error: "Error finding the " + model.toString()});
    
          req.resource = resource;
          next();
        });
      }
    }
    
    app.get('/playlist/:id', loadResource(Playlist), function(req, res) {
      var playlist = req.resource;
      ...
    });
    
    app.get('/user/:id', loadResource(User), function(req, res) {
      var user = req.resource;
      ...
    });
    

    express 源包含 pretty good example of this patternmiddleware section in the docs(特别是在“路由中间件”下)进一步详细说明。

    【讨论】:

    • 这是一个绝妙的答案。感谢您对此的帮助!
    • 很高兴能帮上忙!祝你好运! ^_^
    • 谢谢,太好了;不幸的是,答案末尾的链接不再有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-31
    • 2012-08-05
    • 2012-12-28
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    相关资源
    最近更新 更多