【发布时间】:2018-04-01 13:05:38
【问题描述】:
我正在尝试重构基于 Express 的简单 API 代码以使用承诺而不是回调。我唯一的挑战是处理 Mongoose 验证错误(如果用户存在的示例测试)并将这个错误扔到中间件中。
我正在通过 index.js 上的中间件处理错误:
// Error handling middleware
app.use(function(err, req, res, next){
res.status(422).send({error: err._message})
});
这段代码成功地处理了所有边缘情况,除了existingUser部分,错误被遗忘并且在响应中不可见:
router.post('/signup', function(req, res, next) {
const email = req.body.email;
const password = req.body.password;
// Custom error
if (!email || !password) {
return res.status(422).send({ error: 'You must provide email and password'});
}
User.findOne({ email: email })
.then(function(existingUser) {
// If a user with email does exist, return an error
if (existingUser) {
// return res.status(422).send({ error: 'Email is in use' });
throw new Error('User already exists!');
}
// If a user with email does NOT exist, create and save user record
const user = new User({
email: email,
password: password
});
// save to database
return user.save()
})
.then(function(user) {
// Respond to request indicating the user was created
res.json({ token: tokenForUser(user) });
})
.catch(next);
注意我注释掉了这段代码,因为它会抛出错误“发送后无法设置标头”:
return res.status(422).send({ error: 'Email is in use' });
我的问题是:
- 我处理自定义验证错误(例如测试电子邮件或密码字段是否为空白)的方式是否正确,或者有更好的方法,因为我没有通过错误中间件传递这些错误?
- 如何处理 Promise 中的错误?
【问题讨论】:
标签: javascript node.js mongodb express mongoose