如何解析从后端接收并作为javascript中的错误对象发送的错误
最后一个问题是错误对象构造函数,它使在catch错误处理程序中传递给它的响应对象变得无用 我使用的sdk具有以下方法:如何解析从后端接收并作为javascript中的错误对象发送的错误,javascript,json,parsing,object,response,Javascript,Json,Parsing,Object,Response,最后一个问题是错误对象构造函数,它使在catch错误处理程序中传递给它的响应对象变得无用 我使用的sdk具有以下方法: /** *Axios请求 *@param方法请求方法 *@param url服务器url *@param requestConfig自定义Axios配置 */ 异步请求(方法、url、requestConfig){ 试一试{ const response=wait this.axios.request(Object.assign({method, url},requestCon
/**
*Axios请求
*@param方法请求方法
*@param url服务器url
*@param requestConfig自定义Axios配置
*/
异步请求(方法、url、requestConfig){
试一试{
const response=wait this.axios.request(Object.assign({method,
url},requestConfig));
返回响应数据;
}
捕获(错误){
if(error.response){
抛出新错误(Error.response.data.message);
}
否则{
投掷误差;
}
}
}
我正在尝试分析此方法发出的错误。
我对第二种情况没有问题-抛出错误代码>
但在第一种情况下,我无法解析消息-抛出新错误(Error.response.data.message)代码>
如果我使用console.log调试错误(“错误:,错误”)代码>我在控制台中获得错误:错误:[object]
如果我调试console.log('sdk=>error.response.data.message:',error.response.data.message')代码>在发出错误之前,在上面的代码中显示:
sdk => error.response.data.message:
[{…}]
0:
messages: Array(1)
0: {id: "Auth.form.error.user.not-exist", message: "This email does not exist."}
length: 1
__proto__: Array(0)
__proto__: Object
length: 1
__proto__: Array(0)
可能问题在于错误需要在其构造函数中包含一个字符串,因此,它在对象上执行toString()方法
这是我在查看检查工具中的“网络”选项卡时得到的响应:
{"statusCode":400,"error":"Bad Request","message":[{"messages":[{"id":"Auth.form.error.user.not-exist","message":"This email does not exist."}]}]}
我只能输出以下内容:错误。消息[0]
如果我尝试错误。消息[0]。消息则未定义
如果我尝试:const errorToJSON=JSON.parse(error)
Unhandle Rejection (SyntaxError): Unexpected token E in JSON at position 0
我需要的是消息的文本值:“此电子邮件不存在。”
提前感谢。如果响应以字符串形式返回,则可以使用JSON.parse()
Javascript函数将其转换为JSON对象
一旦响应为JSON格式,您就可以通过遍历响应来检索值:
var errorMessage=response.message[0]。messages[0]。message;
我创建了一个对象来模拟响应。为了了解如何从中提取数据,了解正在检查的对象的结构非常重要
error
是在try/catch中捕获的对象
错误。响应
是保存响应数据的对象
error.response.data
是您视为返回数据的JSON
error.response.data.message
是一个消息数组
在下面的代码中,您将抛出一个新的Error
对象,并将消息数组传递给构造函数。此操作失败的原因是,错误对象的构造函数需要String
类型变量
解决此问题的一个选项是在消息数组上使用JSON.stringify
,并将其传递到错误对象构造函数。前面提到过,您也可以抛出error.response.data.message
对象。这取决于你去弄清楚这些或其他选项中的任何一个是否最适合你的项目
下面是使用stringify
方法的示例:
if (error.response) {
throw new Error(JSON.stringify(error.response.data.message));
}
下面是抛出消息数组的示例:
if (error.response) {
throw error.response.data.message;
}
,您应该能够使用error.message[0]。messages[0]。message
将错误消息传出。请参见演示:
const error={“statusCode”:400,“error”:“错误请求”,“消息”:[{“消息”:[{“id”:“Auth.form.error.user.not exist”,“消息”:“此电子邮件不存在。”}]}
console.log(error.message[0]。messages[0]。message)
soerror.message[0]。消息[0]。消息
只是解释一下为什么会发生@epascarello,他们的答案是正确的。当您调用console.log
时,它会尝试将所有内容转换为字符串,并且(据我所知)对象的默认。toString
是[object object]
。谢谢@epascarello,我没有定义。我将用这个细节更新这个问题。你为什么不一边调试一边向下钻呢?输出error
,检查它是否有消息属性,然后输出error.message
,检查它是否是数组,然后输出error.message[0]
,检查它是否有消息属性等。如果你尝试的话,你真的可以自己完成。谢谢@mitchcout,但是响应是一个对象。井I控制台日志(错误类型);如果它已经是一个对象,只需跳过该步骤,您应该能够使用上面的代码段访问该值谢谢@daddygames,但是如果我尝试使用JSON解析错误。解析(错误)我得到以下错误:未处理的拒绝(SyntaxError):JSON中位置0处的意外标记E如果数据已经是一个对象,然后调用JSON.parse(error)
可能会产生您描述的错误。跳过解析部分,看看答案的其余部分是否解决了这个问题?我得到了这个错误-无法读取未定义的属性“forEach”
<代码>错误类型。消息[0]=>string
@MiguelÁngelTorres我们看不到您这边有什么不对劲的地方。你介意在上面的问题中添加一些你正在使用的代码吗?如果没有更多信息,将很难提供帮助。谢谢@daddygame。是的,你说得对。我刚刚更新了我的问题。谢谢你,詹姆斯。如果我输入error.message[0]。messages[0]
我得到无法读取未定义的属性“0”
并且如果我尝试error.message.flatMap(msg=>msg.messages.map(innerMsg=>innerMsg.message))
我得到类型错误:error.message.flatMap不是函数
听起来像message
在您的情况下不是数组<代码>fl