正确处理Mongoose的获取错误?

时间:2012-05-06 16:27:00

标签: node.js mongodb express mongoose

这是一个纯粹的最佳实践问题。我是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);
};

然而,这种方法会搞乱我的顺序流,因为在执行fetch之前我必须定义回调函数。因此,如果我将大量数据库查询链接在一起,我将不得不以相反的顺序放置回调,这在清晰编码的角度来看远非理想。

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

我也在使用快递框架,所以如果有一种有用的方法来处理快递,我也有兴趣知道。

1 个答案:

答案 0 :(得分:12)

您可以尝试一些有趣的方法。

最简单的说,你可以简单地使用一个函数来加载一个对象并在错误条件下处理输出。

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;
  ...
});

快速来源包含pretty good example of this patternmiddleware section in the docs(特别是在“路由中间件”下)详细说明了这一点。