如何从javascript错误对象读取错误消息
有人能帮我解决以下问题吗:-) 我正在通过下面的redux action打一个post电话如何从javascript错误对象读取错误消息,javascript,Javascript,有人能帮我解决以下问题吗:-) 我正在通过下面的redux action打一个post电话 export const addEmployee = ({ firstName, surname, contactNumber, email }) => async dispatch => { const payloadBody = JSON.stringify({ firstName, surname, contactNumber, email }); fetch('/api/use
export const addEmployee = ({ firstName, surname, contactNumber, email }) => async dispatch => {
const payloadBody = JSON.stringify({ firstName, surname, contactNumber, email });
fetch('/api/users', {
method: 'POST',
body: payloadBody,
headers: {
'Content-Type': 'application/json'
}
})
.then(response => {
if (!response.ok) {
return response.text()
.then(text => {
throw Error(text)
});
} else {
dispatch(setAlert("New Employee added ", 'danger'));
}
})
.catch(error => {
console.log('>>> in CATCH block, error is =>', error);
console.log('>>> in CATCH block, error name is =>', error.name);
console.log('>>> in CATCH block, error message is =>', error.message);
let allKeys = Object.getOwnPropertyNames(error);
console.log(allKeys);
// const errors = [];
// Object.keys(error.message).forEach(key => {
// console.log('>>> key are ', key)
// })
// const keys = Object.keys(error.message);
// console.log(keys);
// const errors = error.message['errors'];
// const errors = error.response.data.errors;
// if (errors) {
// errors.forEach(error => dispatch(setAlert(error.msg, 'danger')));
// }
dispatch({
type: REGISTER_FAIL
});
})
}
在上面的失败后调用中,返回带有错误消息的正文,下面是一个示例
{
"errors": [
{
"msg": "User already exist with email"
}
]
}
问题
我试图实现的是,为了获取errors[]
并将错误消息传递给组件,我遇到的麻烦是访问返回的数组消息中的error[]
数组。我将在下面描述我所尝试的,也可以在我上面发布的redux操作方法中看到
Try-1
console.log('>>>在CATCH块中,错误为=>',错误)代码>只产生错误
Try-2
console.log('>>>在CATCH块中,错误名称为=>',error.name)
产生{“errors”:[{“msg”:“用户已经存在,并且有电子邮件”}]}
并且这是string
,因为我正在返回text()return response.text()。然后(text=>{throw Error(text)})
Try-3
当我作为json()返回时,返回response.json()。然后(text=>{throw Error(text)})
和console.log('>>>在CATCH块中,错误消息是=>',Error.message)代码>生成对象
我要解决的问题是,获取errors[]
并将错误消息传递给下面这样的组件
const errors = error.message; // this is where I'd like to extract the error.
if (errors) {
errors.forEach(error => dispatch(setAlert(error.msg, 'danger')));
}
希望以上描述清楚,如果您需要更多信息,请告诉我,
我知道我缺少一些处理错误对象的关键知识,请有人解释一下这一点好吗?:-)用于抛出从标准格式HTTP负载恢复的错误的模式
您的redux操作确实可以通过HTTP工作。有时服务器会以坏消息作为响应,而且服务器似乎使用了一种标准格式来报告该消息。此外,有时您自己的代码抛出。您希望使用与错误相关的控制结构来处理这两类问题
异步Redux操作的基本模式
在我们开始之前:您的操作被标记为async
,但您仍在链接。然后
和。catch
。让我们切换到async/await,将其转换为:
export const addEmployee=(/*…*/)=async(dispatch,getState)=>{
获取(/*…*/)
。然后(响应=>{
返回response.text()
.然后(文本=>{
//快乐路径逻辑
抛出错误(文本)
})
})
.catch(错误=>{
//悲伤路径逻辑
分派(/*…*/)
})
}
……在这方面:
export const addEmployee=(/*…*/)=async(dispatch,getState)=>{
试一试{
let response=等待获取(/*…*/)
let responseText=等待响应。text()
//快乐路径逻辑
分派(/*…*/)
return//redux操作应该返回有意义的内容
}捕获(错误){
//悲伤路径逻辑
分派(/*…*/)
return//redux操作失败也应返回有意义的内容
}
}
现在让我们谈谈错误
错误基础
会见:
尝试{throw'mud'}捕获(异常){/*异常==='mud'*/}
尝试{throw 5}捕获(异常){/*异常===5*/}
尝试{抛出新日期()}捕获(异常){/*异常是日期*/}
你几乎可以抛出任何东西。执行时,执行会停止并立即跳转到最近的catch
,在堆栈中搜索所有路径,直到找到一个或耗尽堆栈。无论它到达哪里,您提供给throw
的值都将成为catch
接收的参数(称为“异常”)。如果没有任何内容捕获它,JS控制台会将其记录为“未捕获的异常”
你可以扔任何东西,但你应该扔什么?我认为您应该只抛出Error
的实例或其子类之一。两个主要原因是Error
类做了一些有用的事情(比如捕获stacktrace),并且因为两个失败源中的一个已经将抛出Error
实例,所以如果希望使用单个代码路径处理这两个实例,则必须执行类似的操作
会见:
试试看{
抛出新错误(“坏消息”)
}捕获(错误){
console.log(错误消息)
//>“坏消息”
}
我们已经知道,如果操作中的代码崩溃,例如,JSON.parse
在响应体上失败,将抛出一个错误
,因此在这些场景中,我们不必做任何特殊的操作来将执行引导到catch
路径上
我们唯一需要负责的是检查HTTP响应是否包含类似于服务器“标准错误负载”的内容(稍后将详细介绍),您的示例建议如下:
{
“错误”:[
{
“msg”:“此处有错误内容”
}
]
}
这是核心问题
这种处理必须是特殊的,因为没有javascript引擎认为仅仅接收可以解析为JSON并包含名为“errors”的键的HTTP负载是错误的。(他们也不应该这样做。)这个有效负载模式仅仅是一些或所有与您交谈的HTTP端点使用的自定义约定
这并不是说这是个坏主意。(我认为它很棒!)但这也解释了为什么它必须是定制的:因为这个模式只是你私人的小东西,实际上并没有什么特殊之处,浏览器会以你想要的特殊方式对待它
我们的计划是:
发出请求,依靠try/catch捕获工具抛出的内容
- 如果我们得到的答复似乎不好:
- 检查有效负载是否存在以“标准格式”编码的错误;我把这种情况称为“API错误”
- 如果我们发现一个API错误,我们将创建并抛出我们自己的
错误
,使用API错误内容作为
[objection] [topic]
'missing lastName'
'unknown userId'
'unavailable player_color'
'forbidden emailAddress'
'invalid x'
[operation] failed