【问题标题】:Request sent by axios ran by Laravel twiceaxios 发送的请求被 Laravel 运行了两次
【发布时间】:2020-05-03 00:36:33
【问题描述】:

所以我想使用 axios 从前端向 Laravel 发送请求,它是跨域的,所以前端位于 localhost:3000,后端位于 localhost:8000/api

在 Laravel 中,我已经使用 this 应用了 CORS 中间件。在 axios 我已经设置了标题。

axios 设置

axios.defaults.baseURL = API_URL
axios.defaults.headers.common.Accept = 'application/json'
axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'
axios.defaults.headers.common['Access-Control-Allow-Origin'] = '*'

axios 发布和删除:

 function create(){
    return dispatch => {
        return new Promise((resolve,reject)=>{
            HTTP.get('/post/category/create')
                .then((data)=>{
                    return resolve(data.data.data)
                }).catch((data)=>{
                    return reject(data)
                })
        })
    }
}
export function destroy(data){
    return dispatch => {
        return new Promise((resolve,reject)=>{
            HTTP.delete(`/post/category/${data}`)
                .then((data)=>{
                    return resolve(data.data)
                }).catch((data)=>{
                    return reject(data)
                })
        })
    }
}

我如何调用函数:

 var SubmitCategory = async (e) => {
        e.preventDefault();
        var formData = new FormData(e.target)
        await setSubmit(true);
        await props.dispatch(insert(formData))
            .then(data=>{
                toaster(data.message,data.status)
                props.history.replace({
                    pathname: `/post/category`
                })
            })
            .catch(data=>{
                toaster(data.message,"error")
                setError(data)
            })
        await setSubmit(false)
    }


<form autoComplete="off" onSubmit={e=>SubmitCategory(e)}> <<--- onSubmit
...////

laravel 函数的外观:

public function store(Request $request)
{
    // return response()->json($request,500);
    try {
        DB::beginTransaction();
        $data = $request->all();

        $cat = Category::create($data);

        DB::commit();

        return response()->json([
            'status'     => 'success',
            'id'         => $cat->id,
            'code'       =>  200,
            'message'    => 'Category Created'
        ],200);

    } catch (\Exception $e) {
        DB::rollback();
        return response()->json([
            'status'     => 'error',
            'code'       =>  500,
            'message'    => $e->getMessage()
        ],500);
    }
}

这发生在每个方法上,所以当我创建一些东西时,它会创建两条记录,当我删除一些东西时,第一个将被成功删除,而第二个不需要的请求失败(因为它已经被删除了)。

我的第一个想法是 axios 发送了两个请求,其中一个是OPTIONS 方法,我做了一些谷歌研究,它无法关闭以及其他一些处理它的方法,仍然没有。

编辑 cors.php 文件

<?php

    'paths' => ['api/*'],
    'allowed_methods' => ['*'],
    'allowed_origins' => ['*'],
    'allowed_origins_patterns' => [],
    'allowed_headers' => ['*'],
    'exposed_headers' => [],
    'max_age' => 600,
    'supports_credentials' => false,

【问题讨论】:

  • 遇到同样的问题,你找到解决办法了吗?

标签: javascript php reactjs laravel axios


【解决方案1】:

当您使用 CORS 时,浏览器可能需要在 GET 请求之前发送 OPTIONS 请求。 (如果是这样,当您使用XMLHttpRequest/fetch/etc 发出GET 时,它会自动执行此操作。)您需要在服务器端区分OPTIONS 请求和GET 请求,并且仅实际当你得到GET 时做这项工作,而不是当你得到OPTIONS 之前。


旁注:Access-Control-Allow-Origin响应 标头。你不应该告诉axiosrequest 发送它(这样做不会做任何事情)。 More on that here...

【讨论】:

  • GET 方法很好,但运行两次的是POSTDELETE 方法,如果有帮助,我添加了cors.php 文件。那么我需要改变什么?对不起,如果我的问题看起来很奇怪,这是我第一次在不同域中使用 cors 做前端和后端
  • @Asary - 基本原理相同(我很高兴你说这是POSTDELETEOPTIONSGET 来说有点奇怪-- 有时需要,但通常不需要)。你需要告诉 Laravel 处理OPTIONS。 (我不使用 Laravel,所以我不知道你具体是怎么做的。)
  • 所以我这样做了,我创建了一个中间件,以便任何 OPTIONS 方法返回一个空的 200 响应,我不知道这是否是最佳实践,但它现在可以工作,暂时.谢谢!
  • 在生产环境中,OPTIONS 方法应该在你的 Web 服务器(例如 Nginx)中处理和终止,这样这些请求就不会到达 PHP 引擎。
猜你喜欢
  • 2019-12-11
  • 1970-01-01
  • 2019-09-13
  • 1970-01-01
  • 2019-11-17
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多