从控制器读取 json 响应到 Axios Catch 部分 - Laravel Vue Axios

Posted

技术标签:

【中文标题】从控制器读取 json 响应到 Axios Catch 部分 - Laravel Vue Axios【英文标题】:Read json response from controller to Axios Catch section - Laravel Vue Axios 【发布时间】:2018-09-24 22:29:51 【问题描述】:

我有一个方法,通过axios生成的一个PUT来捕获vue视图(Profile.vue)发送的信息,问题出在以下,当数据更新时(使用UserController的myProfile方法), axios从方法中抓取返回的json信息,显示成功,但是出现错误时,axios没有抓取错误的json信息,报如下:

Uncaught (in promise) TypeError: Cannot read property 'status' of undefined

我了解您是通过我在 Axios 的 catch 部分中没有信息的变量来向我指控的。

我的个人资料代码(用户控制器)

$profile = User::find(Auth::user()->id);
$profile->firstname = $request->firstname;
$profile->lastname = $request->lastname;
$profile->gender = $request->gender;
$profile->description = $request->description;
if($profile->update())

    return response()->json([
            'status' => 'Muy bien!',
            'msg' => 'Datos actualizados correctamente.',
            'cod' => 201
    ]);

else
        return response()->json([
            'status' => 'Ocurrio un error!',
            'msg' => 'Ocurrio un error al actualizar la información.',
            'cod' => 400
            ]);

Profile.vue 的 Axios 部分

axios.put('/dashboard/profile', value)
        .then((response) => 
            let title = response.data.status;
            let body = response.data.msg;
            this.displayNotificationSuccess(title, body);
        )
        .catch((response) => 
            let title = response.data.status;
            let body = response.data.msg;
            this.displayNotificationError(title,body);
        )

前面说了,控制器成功时,axios读取并显示消息json,出错时不显示。

Axios 无法显示来自控制器的错误 json 消息我在哪里失败?

我使用 Laravel 5.6、Vuejs 2 和 Axios

【问题讨论】:

【参考方案1】:

catch 回调中,参数是错误对象,而不是response 对象。试试这个:

axios.put('/dashboard/profile', value)
    .then((response) => 
        let title = response.data.status;
        let body = response.data.msg;
        this.displayNotificationSuccess(title, body);
    )
    .catch((error) => 
        let title = error.response.data.status;
        let body = error.response.data.msg;
        this.displayNotificationError(title,body);
    )

SOURCE

【讨论】:

【参考方案2】:

首先 - 您必须在后端定义第二部分实际上是一个错误,否则 axios 会将其视为成功请求。

您可以通过将错误状态代码作为第二个参数添加到response()->json(json, code) 来做到这一点。可以看到状态码列表here。

例子:

return response()->json([
    'status' => 'Ocurrio un error!',
    'msg' => 'Ocurrio un error al actualizar la información.',
    'cod' => 400
], 400);

其次,axios .catch() 返回错误,而不是响应。为了得到响应,您必须致电err.response

例子:

.catch((response) => 
    let title = response.response.data.status;
    let body = response.response.data.msg;
    this.displayNotificationError(title,body);
)

【讨论】:

现在我明白了,但我在错误消息中有问题,现在显示 de toast 通知,但在实验室中没有文本错误消息,chrome 控制台显示此“PUT localhost:8000/dashboard/profile500(内部服务器错误)”我是 laravel vue 的新手 不确定,您必须阅读错误。您可以在 storage/logs/laravel.log 文件或开发者工具的响应预览中阅读它。

以上是关于从控制器读取 json 响应到 Axios Catch 部分 - Laravel Vue Axios的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Vuejs 读取流 + json 响应?

无法从 axios 函数之外的 axios GET 请求响应中读取值

如何使用 nodeJS 从 axios 库中获取有效的 JSON 响应

使用 Axios 从 laravel 控制器捕获错误

如何从 axios 响应对象中的所有项目中提取特定值到 vuex 状态

尽管响应为 200,但 Axios 状态为 449