gpt4 book ai didi

node.js - 正确处理 Mongoose 的获取错误?

转载 作者:IT老高 更新时间:2023-10-28 13:20:00 32 4
gpt4 key购买 nike

这是一个纯粹的最佳实践问题。我对 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 中处理它,我也很想知道。

最佳答案

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

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

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 中。 .

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, 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 pattern ,以及 middleware section in the docs (特别是在“路由中间件”下)进一步详细说明。

关于node.js - 正确处理 Mongoose 的获取错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10472164/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com