Mic*_* D. 7 mongoose mongodb node.js express
这是一个纯粹的最佳实践问题.我是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
});
Run Code Online (Sandbox Code Playgroud)
函数调用顶部的错误处理很烦人,因为我必须为每次调用数据库重复该代码......或者我认为.
我想过使用像这样的回调:
var fetchCallback = function(err,objOrDoc,callback){
//Handle the error messages
callback(objOrDoc);
};
Run Code Online (Sandbox Code Playgroud)
但是,这种方法会搞乱我的顺序流,因为在执行fetch之前我必须定义回调函数.因此,如果我将大量数据库查询链接在一起,我将不得不以相反的顺序放置回调,这在清晰编码的角度来看远非理想.
我想知道是否有人遇到过这个问题并且有任何减少重复的最佳做法.
我也在使用快速框架,所以如果有一种有用的方法来处理它,我也有兴趣知道.
Mic*_*ley 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.
});
});
Run Code Online (Sandbox Code Playgroud)
这仍然是相当多的重复,所以我可能会尝试将其转移到中间件中.
路由中间件
路由可以通过将一个或多个附加回调(或数组)传递给方法来利用特定于路由的中间件.此功能对于限制访问,加载路由使用的数据等非常有用.
现在我还没有对它进行测试,它有点手动(读取:伪代码),但我认为它应该是一个不错的例子.
// 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;
...
});
Run Code Online (Sandbox Code Playgroud)
快速源包含这个模式的一个很好的例子,文档中的中间件部分(特别是在"路由中间件"下)进一步详述.
| 归档时间: |
|
| 查看次数: |
5083 次 |
| 最近记录: |