Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从javascript错误对象读取错误消息_Javascript - Fatal编程技术网

如何从javascript错误对象读取错误消息

如何从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

有人能帮我解决以下问题吗:-)

我正在通过下面的redux action打一个post电话

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