我是新来的表达+ node.js,所以我用mongoose编写了一个rest api。将运行时错误作为数据库错误等处理的最佳方法是什么?
我在快速文档中读到,您可以使用中间件function(err, res, req, next)
来处理此错误,并且只能调用此函数调用next(err)
。没关系,所以想象一下,你有一个User
moongose模型,你可以在控制器中编写这个函数:
const find = (email, password) => {
User.find({ email: email }, (err, doc) => {
if (err) {
// handle error
}
return doc;
});
};
然后,您在另一个文件中有一个路由处理程序:
router.get('/users', (req, res) => {
userController.find(req.body.email);
});
那么,此时,您可以处理在模型中编写throw(err)
的mongo错误,并在控制器中使用try/catch
然后调用next(err)
对吗?但我已经读过在JavaScript中使用try/catch
并不是一个好习惯,因为它会创建一个新的执行上下文等。
在Express中处理此错误的最佳方法是什么?
答案 0 :(得分:1)
我建议你使用promises。它不仅使您的代码更清晰,而且错误处理也更容易。作为参考,您可以访问this或this。
如果您使用的是猫鼬,您可以插入自己的承诺库。
const mongoose = require('mongoose');
mongoose.connect(uri);
// plug in the promise library:
mongoose.Promise = global.Promise;
mongoose.connection.on('error', (err) => {
console.error(`Mongoose connection error: ${err}`)
process.exit(1)
})
并使用如下:
在控制器中:
const find = (email) => {
var userQuery = User.find({ email: email });
return userQuery.exec();
};
在路由器中:
router.get('/users', (req, res) => {
userController.find(req.body.email).then(function(docs){
// Send your response
}).then(null, function(err){
//Handle Error
});
});