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

时间:2017-03-06 12:21:57

标签: javascript node.js express mongoose

我正在将我们的代码重构为承诺。

带有示例代码的两个块:

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

我如何用承诺实现这一点?我应该添加额外的中间件发送正确的错误消息吗?

我真的很感激为这个方向提供正确方向的一些提示。 提前谢谢!

1 个答案:

答案 0 :(得分:0)

因为err是一个对象我假设express正在为你转换为JSON。但是,当您将错误字符串化时,您会得到' {}';

如果你想返回堆栈跟踪,请尝试.send(err.stack)。

或者,如果您只想要消息而不是整个堆栈,则可以使用err.message。

.catch((err) => {
    console.log(err)
    res.status(404).send(err.stack);
})