这个问题让我感到很恼火,因为我知道这与我无法正确理解问题有关 - 这使得很难找到答案,尽管花了几个小时阅读并尝试不同的事情。
我的问题是,我在用户注册时将用户保存到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\" }"
}
所以我只是在我的客户端代码中没有正确处理它,但仍然不知所措。
答案 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…}
我仍然希望能够通过仅记录错误来查看我可以访问该“响应”属性,因此如果有人对此有任何了解,那么在评论中包含它会很棒。