我正在将我们的代码重构为承诺。
带有示例代码的两个块:
user.service.js
export function updateUserProfileByUsername(req, res) {
userController.getUserByUsername(req.params.username)
.then((userProfile) => {
return userController.saveUserProfileByUser(userProfile,
req.body.email,
req.body.username,
req.body.firstname,
req.body.lastname)
})
.then((updated_user) => {
res.status(200).json(updated_user.profile);
})
.catch((err) => {
res.status(404).send('something went wrong');
});
}
export function getUserProfileByUsername(req, res) {
userController.getUserProfileByUsername(req.params.username)
.then((userProfile) => {
res.status(200).json(userProfile);
})
.catch((err) => {
res.status(404).send('something went wrong');
})
}
user.controller.js
export function getUserProfileByUsername(username) {
return User.findOne({
'username': username
}).exec()
.then((user) => {
if (user)
return user.profile;
else
throw new Error("user not found!");
});
}
export function getUserByUsername(username) {
return User.findOne({
'username': username
}).exec()
.then((user) => {
if (user)
return user;
else
throw new Error("user not found!");
});
}
export function saveUserProfileByUser(user, email, username, firstname, lastname) {
user.email = email;
user.username = username;
user.firstname = firstname;
user.lastname = lastname;
return user.save(); // returns a promise
}
我们的路由输入user / index.js,进入service.js,控制器处理我们的数据库工作和错误。
我想要实现的是向客户端发送拟合错误。 例如:'用户不存在'或'用户名太长'更新错误用户等时
如果我尝试将错误发送到客户端,我将得到一个空的json作为结果({})。如果我记录错误,我会得到完整的堆栈跟踪,包括验证错误。
.catch((err) => {
console.log(err) // shows me full stacktrace of the error
res.status(404).send(err); //sends {} to the client
})
我如何用承诺实现这一点?我应该添加额外的中间件发送正确的错误消息吗?
我真的很感激为这个方向提供正确方向的一些提示。 提前谢谢!
答案 0 :(得分:0)
因为err是一个对象我假设express正在为你转换为JSON。但是,当您将错误字符串化时,您会得到' {}';
如果你想返回堆栈跟踪,请尝试.send(err.stack)。
或者,如果您只想要消息而不是整个堆栈,则可以使用err.message。
.catch((err) => {
console.log(err)
res.status(404).send(err.stack);
})