You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复React向Laravel发送POST请求的代码问题?

Laravel接收React POST数据出现500内部服务器错误的解决方法

后端Laravel接收代码

public function store(ProductRequest $request, UploadImageService $uploadImageService){
       // dd($request->all());
        $product = Product::create($request->validated());

        if ($request->hasFile('image')) {
            $uploadImageService->upload($product, 'image', 'product_images', true, false);
        }
     else{
        return response()->json(['image must be file'],422);
     }
        if ($request->has('color_image')) {
            $data=[];
            foreach ($request->color_image as $key => $images) {
                $data[]=$images;
              
              
            }
            /* dd($data); */
            foreach ($data as $image) {
             /*    dd($image); */
                $mediaItem = $product->addMedia($image)->toMediaCollection('products_images');
                $mediaItem->setCustomProperty('color_id', $key);
                
                $mediaItem->save();
            }
        }
    /*     dd('gfdd'); */
        if ($request->filled('sizes')) {
            $product->sizes()->sync($request->sizes);
        }

        if ($request->filled('categories')) {
            $product->categories()->sync($request->categories);
        }

        if ($request->filled('genders')) {
            $product->genders()->sync($request->genders);
        }
      
        if ($request->filled('colors')) {
            $colors = $request->colors;
          

            if ($product->colors()->count() > 0) {
                for ($i = 0; $i < count($colors['color_id']); $i++) {
                    $product->colors()->attach($colors['color_id'][$i], [ 'stock' => $colors['stock'][$i]]);
              
                }
              

            } else {
            
                $product->colors()->detach();
               // dd(count($colors['color_id']));
                for ($i = 0; $i < count($colors['color_id']); $i++) {
                    $product->colors()->attach($colors['color_id'][$i], [ 'stock' => $colors['stock'][$i]]);
                }
            }


        }
     
        if ($request->filled('materials')) {
            $product->materials()->sync($request->materials);
        }
    

        return $this->successResponse($product);
    }

前端React发送代码(原错误代码)

const colors = { 'color_id[]': [...arrColorId], stock: [...arrColorStock] };
req.append("colors", JSON.stringify(colors));
dispatch(saveNewProduct(req));

后端要求的数据结构

array:2 [ // app/Http/Controllers/Back/ProductController.php:60
  "color_id" => array:1 [
    0 => "1"
  ]
  "stock" => "21"
]

问题原因

前端将colors序列化为JSON字符串后通过FormData发送,Laravel接收到的$request->colors是字符串类型,而非后端期望的数组结构。当代码执行到count($colors['color_id'])时,会因为尝试从字符串中访问数组键而抛出错误,触发500内部服务器错误。

解决办法

不要将colors转为JSON,直接按照Laravel期望的嵌套表单字段格式,逐个添加到FormData中:

// 循环添加color_id数组元素
arrColorId.forEach(id => {
  req.append("colors[color_id][]", id);
});

// 循环添加stock数组元素
arrColorStock.forEach(stock => {
  req.append("colors[stock][]", stock);
});

dispatch(saveNewProduct(req));

这样Laravel就能正确解析出$request->colors为数组结构,后续的循环和关联模型操作可正常执行。

内容的提问来源于stack exchange,提问作者Fuad Rustamzade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 04:27:44