无法响应快递发送的自定义错误消息

时间:2017-06-16 23:52:06

标签: javascript node.js express

这个问题让我感到很恼火,因为我知道这与我无法正确理解问题有关 - 这使得很难找到答案,尽管花了几个小时阅读并尝试不同的事情。

我的问题是,我在用户注册时将用户保存到mongodb数据库,我的架构不允许重复的电子邮件,并向我发回错误。我能够在终端中控制日志记录错误,但是我在将其发送回客户端时遇到问题。或者我在使用它时遇到问题,如果它回来了,我不太确定在这两个步骤中我将无法访问错误消息。

这是我保存用户的POST路由:

router.post('/users', (req, res) => {
  let body = _.pick(req.body, ['email', 'password']);
  let user = new User(body);

  user.save().then(() => { // this all works and will save the user, if there are no errors
    return user.generateAuthToken();
  }).then((token) => {
    res.header('Authorization', `Bearer ${token}`).send(user);
  }).catch((err) => { // This is where my problem is
    console.log(err); // This will log the mongodb error here, about duplicate emails
    res.status(500).send(err); // I'm trying to send the mongodb error message back to the client to display it on the screen (I will handle making the message friendly to read, once I can get this to work)
  });
});

所以我的问题是获取mongo错误,然后我尝试将其发送给客户端。

这是我的客户端代码:

axios({
  method: 'post',
  url: '/auth/users',
  headers: {
    'Content-Type': 'application/json'
  },
  data: {
    email,
    password
  }
}).then((res) => {
  console.log('this is the response', res);
  if (res.status === 200) {
    var authToken = res.headers.authorization.split(' ')[1];
    authenticateUser(authToken);
    this.props.history.replace('/dashboard');
  } // This all works fine for a signup with no errors
}).catch((err) => {
  console.log('Signup error:', err);
  // I am expecting the above line of code to log the long Mongodb 
  // error message that I am sending back in my res.status(500).send(err)
  // catch call from the server, but instead all I am getting is
  // "Signup error: Error: Request failed with status code 500"
});

要么我没有正确发送错误,要么在回来时我没有正确处理错误,但我不知道它是什么或为什么。

我甚至无法发回res.status(500).send('some string here')并访问该字符串。

由于

更新

所以我只是通过发送可能导致错误的POST来检查邮递员,并且我收到了正确的响应。

我的服务器捕获实际上是这样的:

.catch((err) => {
  res.status(500).send({message: err.message});
});

邮递员回复机构看起来像这样:

{
  "message": "E11000 duplicate key error collection: authBoilerplate.users index: email_1 dup key: { : \"email@example.com\" }"
}

所以我只是在我的客户端代码中没有正确处理它,但仍然不知所措。

1 个答案:

答案 0 :(得分:2)

谢谢大家,我能够找到我的问题的答案,所以我在这里发帖,希望它可以帮助别人。

我肯定是在发送自定义错误消息,我只是在客户端没有正确处理它。

当我在客户端上使用catch调用并记录错误时,我希望看到错误中包含的所有内容。事实证明,错误以response属性error.response返回,这就是所有消息传递的地方。

所以改变我的捕获呼叫:

axios(//... send post in here)
.then(// ... same as in my question)
.catch((err) => {
  console.log('error', err);
  console.log('error response', err.response); // this is where the actual error response message is error.response.message
});

导致记录堆栈跟踪和错误响应:

error Error: Request failed with status code 500
    at createError (eval at <anonymous> (bundle.js:541), <anonymous>:16:15)
    at settle (eval at <anonymous> (bundle.js:847), <anonymous>:18:12)
    at XMLHttpRequest.handleLoad (eval at <anonymous> (bundle.js:520), <anonymous>:77:7)
error response Object {data: Object, status: 500, statusText: "Internal Server Error", headers: Object, config: Object…}

我仍然希望能够通过仅记录错误来查看我可以访问该“响应”属性,因此如果有人对此有任何了解,那么在评论中包含它会很棒。