使用laravel和nextjs调用axios时出错

unguejic  于 2023-10-18  发布在  iOS
关注(0)|答案(1)|浏览(94)

我使用Laravel作为后端,NextJs作为前端。问题是在发送表格的时候
我从服务器得到以下响应:error
正确获取csrf令牌,它与cookie中的存储相匹配。
web file.php中的路径为Route::post('/administracion/nuevo-producto', [ProductosController::class, 'store'])->name('productos');
ProductoController包括return response()->json(['message' => 'Datos guardados exitosamente']);
Cors.php:

'paths' => ['api/*',  'getCsrf'],
    'allowed_methods' => ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'],
    'allowed_origins' => [env('FRONTEND_URL', 'http://localhost:3000')],
    'allowed_origins_patterns' => [],
    'allowed_headers' => ['Content-Type', 'Authorization', 'x-xsrf-token'], // Agregamos 'X-Xsrf-Token' aquí
    'exposed_headers' => [],
    'max_age' => 0,
    'supports_credentials' => true,

在kernel.php包含\App\Http\Middleware\VerifyCsrfToken::class
我在NextJS中的组件

import Head from 'next/head'
import { useAuth } from '@/hooks/auth'
import { router } from 'next/router'
import { useEffect, useState } from 'react'
import AppLayout from '@/components/Layouts/AppLayout'
import axios from 'axios'

export default function adminIndex() {
    const { user } = useAuth()

    const rolesAutorizados = [1]
    useEffect(() => {
        if (user) {
            if (!rolesAutorizados.includes(user.id_rol)) {
                router.push('/dashboard')
            }
        }
    }, [user])

    function getCookie(name) {
        if (typeof document !== 'undefined') {
            const cookies = document.cookie.split(';')
            for (let i = 0; i < cookies.length; i++) {
                const cookie = cookies[i].trim()
                if (cookie.startsWith(name + '=')) {
                    return cookie.substring(name.length + 1)
                }
            }
        }
        return null
    }
    

    const [nombre, setNombre] = useState('');
    const handleSubmit = async e => {
        e.preventDefault()

        try {
            // Crea un objeto con los datos del formulario
            const formData = {
                nombre,
               
            }
            // Agrega el token CSRF al encabezado de la solicitud
            const headers = {
                'X-XSRF-TOKEN': getCookie('XSRF-TOKEN'),
            }

            // Realiza la solicitud POST a tu servidor Laravel
            const response = await axios.post('/administracion/nuevo-producto', formData, {
                headers,
            })

            // Maneja la respuesta del servidor si es necesario
            console.log('Respuesta del servidor:', response.data)
        } catch (error) {
            console.error('Error al enviar la solicitud:', error)
        }
    }

    return (
        <>
            <AppLayout
                header={
                    <h2 className="font-semibold text-xl text-gray-800 leading-tight">
                        Nuevo producto
                    </h2>
                }>
                <Head>
                    <title> Nuevo producto - Mar Nails</title>
                </Head>
                <div className="py-12">
                    <div className="max-w-7xl mx-auto sm:px-6 lg:px-8">
                        <div className="bg-white overflow-hidden shadow-sm sm:rounded-lg">
                            <div className="p-6 bg-white border-b border-gray-200">
                                <form onSubmit={handleSubmit}>
                                    {/* Campos del formulario */}
                                    <div>
                                        <label>Nombre:</label>
                                        <input type="text" value={nombre} onChange={(e) => setNombre(e.target.value)} />
                                    </div>
                                    {/* ...otros campos del formulario */}

                                    <button type="submit">Enviar</button>
                                </form>
                            </div>
                        </div>
                    </div>
                </div>
            </AppLayout>
        </>
    )
}

储存方法:

public function store(Request $request)
{

    $producto = new producto();
    $producto->nombre = $request->input('nombre');
    $producto->descripcion = $request->input('descripcion');
    $producto->precio = $request->input('precio');
    $producto->stock = $request->input('stock');
    $producto->estado = $request->input('estado');

    //para guardar la imagen
    if ($request->hasFile('imagen')) {
        $extension = $request->file('imagen')->getClientOriginalExtension(); //obtengo el tipo de extension
        $nombreSinEspacios = str_replace(' ', '', $request->input('nombre')); //saco los espacios para evitar problemas
        $nombreImagen = $nombreSinEspacios . '.' . $extension; //armo el nuevo nombre del archivo agregandole la extension
        $path = $request->file('flyer')->storeAs('/productos', $nombreImagen, 'public'); //subo a /productos la imagen
        $producto->url_imagen = $path; //guardo en la bd la url a la imagen
    }

    //para guardar la ciudad
    $ciudad = Ciudad::find($request->input('id_ciudad'));
    $producto->id_ciudad()->associate($ciudad);

    $producto->save();
    return response()->json(['message' => 'Datos guardados exitosamente'], 200);

}
piok6c0g

piok6c0g1#

您的Axios头文件不包含与Laravel进行JSON通信所需的头文件。将此添加到您的Axios头配置:

'Accept': 'application/json'
'Content-Type': 'application/json'

这样Laravel就会知道它需要以JSON格式响应你。它可能不会解决根本问题,但至少你会得到JSON响应。

相关问题