Javascript 节点返回错误正确(例如验证错误)

Javascript 节点返回错误正确(例如验证错误),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,

我正在将代码重构为承诺

带有示例代码的两个块:

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');
    })
}
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);
})

像往常一样,明显而简单。非常感谢!