这是一个纯粹的最佳实践问题.我对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之前我必须定义回调函数.因此,如果我将大量数据库查询链接在一起,我将不得不以相反的顺序放置回调,这在清晰编码的角度来看远非理想.
我想知道是否有人遇到过这个问题并且有任何减少重复的最佳做法.
我也在使用快速框架,所以如果有一种有用的方式来处理它,我也有兴趣知道.
解决方法
您可以在这里尝试几种有趣的方法.
最简单的是,您可以简单地使用一个函数来加载对象并在错误条件下处理输出.
fetchResource = function(model,req,res,callback) { model.findById(req.params.id,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,function(playlist) { // code to deal with playlist. }); });
这仍然是相当多的重复,所以我可能会尝试将其移至middleware.
Route Middleware
Routes may utilize route-specific middleware by passing one or more additional callbacks (or arrays) to the method. This feature is extremely useful for restricting access,loading data used by the route etc.
现在我还没有对它进行测试,它有点手动(读取:伪代码),但我认为它应该是一个不错的例子.
// assuming a URL of '/playlist/5' or '/user/10/edit',etc. function loadResource(model) { return function(req,next) { model.findById(req.params.id,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),res) { var playlist = req.resource; ... }); app.get('/user/:id',loadResource(User),res) { var user = req.resource; ... });
快递源包含pretty good example of this pattern,而middleware section in the docs(具体在“路由中间件”下)则进一步详述.