Javascript 节点返回错误正确(例如验证错误)
我正在将代码重构为承诺 带有示例代码的两个块: user.service.jsJavascript 节点返回错误正确(例如验证错误),javascript,node.js,express,mongoose,Javascript,Node.js,Express,Mongoose,我正在将代码重构为承诺 带有示例代码的两个块: user.service.js export function updateUserProfileByUsername(req, res) { userController.getUserByUsername(req.params.username) .then((userProfile) => { return userController.saveUserProfileByUser(userProfile,
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');
})
}
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.controller.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');
})
}
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
})
我如何通过承诺来实现这一点?我应该添加额外的中间件来发送正确的错误消息吗
我真的很感激你给我一些正确方向的提示。
提前谢谢 因为err是一个对象,我假设express正在为您转换为JSON。然而,当你字符串化一个错误时,你会得到“{}” 如果要返回堆栈跟踪,请尝试.send(err.stack) 或者,如果只需要消息而不需要整个堆栈,则可以使用err.message
.catch((err) => {
console.log(err)
res.status(404).send(err.stack);
})
像往常一样,明显而简单。非常感谢!