Как устранить эту сетевую ошибку axios, которая, похоже, является ошибкой CORS.

Вопрос или проблема

Когда я заполняю форму регистрации, у меня возникает ошибка сети axios, это началось после того, как я начал использовать библиотеку cors. У меня есть следующие файлы. Ниже приведена ошибка в консоли

AxiosError {message: ‘Ошибка сети’, name: ‘AxiosError’, code: ‘ERR_NETWORK’, config: {…}, request: XMLHttpRequest, …}
code
:
“ERR_NETWORK”
config
:
{transitional: {…}, adapter: Array(3), transformRequest: Array(1), transformResponse: Array(1), timeout: 0, …}
message
:
“Ошибка сети”
name
:
“AxiosError”
request
:
XMLHttpRequest {onreadystatechange: null, readyState: 4, timeout: 0, withCredentials: true, upload: XMLHttpRequestUpload, …}
stack
:
“AxiosError: Ошибка сети\n at XMLHttpRequest.handleError (http://localhost:5173/node_modules/.vite/deps/axios.js?v=b6b0c7b9:1634:14)\n at Axios.request (http://localhost:5173/node_modules/.vite/deps/axios.js?v=b6b0c7b9:2156:41)\n at async handleSubmit (http://localhost:5173/src/routes/register/register.jsx?t=1728273841083:34:19)”
[[Prototype]]
:
Error
constructor
:
ƒ AxiosError(message, code, config, request, response)
toJSON
:
ƒ toJSON()
isAxiosError
:
true
[[Prototype]]
:
Object

это мой register.jsx

import "./register.scss";
import { Link } from "react-router-dom";
import axios from "axios";
import {useState} from "react";
import { useNavigate } from "react-router-dom";

function Register() {
const [error,setError] =useState("")

const navigate =useNavigate()

  const handleSubmit = async (e) =>{
    e.preventDefault();
const formData = new FormData(e.target);

const username = formData.get("username");
const email = formData.get("email");
const password = formData.get("password");

try{

const res = await axios.post("http://localhost:8000/api/auth/register",{
  username,
  email,
  password
}, { withCredentials: true })
/*navigate("/login")*/console.log(res.data)
}catch(err){
  console.log(err);
  setError(err.response.data.message)
}
  };
  return (
    <div className="register">
      <div className="formContainer">
        <form onSubmit={handleSubmit}>
          <h1>Создать аккаунт</h1>
          <input name="username" type="text" placeholder="Имя пользователя" />
          <input name="email" type="text" placeholder="Электронная почта" />
          <input name="password" type="password" placeholder="Пароль" />
          <button >Зарегистрироваться</button>
          {error && <span>{error}</span>}
          <Link to="/login">У вас уже есть аккаунт?</Link>
        </form>
      </div>
      <div className="imgContainer">
        <img src="/bg.png" alt="" />
      </div>
    </div>
  );
}

export default Register;

это мой app.js

import express from "express";
import cors from "cors";
import cookieParser from "cookie-parser";
import { postRoute } from "./routes/post.route.js";
import authRoute from "./routes/auth.route.js"

const app = express();

app.use(cors({
    origin: process.env.CLIENT_URL, // Убедитесь, что это соответствует URL фронтенда
    credentials: true,
    methods: ["GET", "POST", "PUT", "DELETE"]
}));

app.use(express.json());
app.use(cookieParser());

app.use("/api/posts", postRoute);
app.use("/api/auth", authRoute);

app.listen(8000, ()=>{
    console.log("сервер запущен");
});

это мой .env файл


CLIENT_URL = http://localhost:5173

следующий файл – это auth.controller.js


import bcrypt from "bcrypt";
import jwt from "jsonwebtoken";
import prisma from "../lib/prisma.js";

export const register = async (req,res)=>{
const{username, email, password}=req.body

try{
//Хешируем пароль

const hashedPassword = await bcrypt.hash(password, 10);
//создаем нового пользователя

//сохраняем в БД

const newUser = await prisma.user.create({
    data:{
        username,
         email, 
         password: hashedPassword,
    },
});

console.log(newUser);

res.status(201).json({message:"Пользователь успешно создан"});
}catch(err){
    console.log(err)
    res.status(500).json({message:"Не удалось создать пользователя!"})
}
};

export const login = async (req,res)=>{
    const {username, password}=req.body;

    try{
    //проверяем, существует ли пользователь
const user =await prisma.user.findUnique({
    where:{username}
})

if(!user)return res.status(401).json({message:"Неверные учетные данные!"})
    //проверяем, правильный ли пароль
   const isPasswordValid = await bcrypt.compare(password, user.password);

   if(!isPasswordValid) return res.status(401).json({message:"Неверные учетные данные!"})
    //Генерируем токен и отправляем пользователю
//res.setHeader("Set-Cookie", "test=" + "myValue").json("success")
const age = 1000*60*60*24*7;

const token = jwt.sign({
    is:user.id
}, 
process.env.JWT_SECRET_KEY,
{expiresIn:age}
);

res.cookie("token", token, {
    httpOnly:true,
    //secure:true,
    maxAge:age
}).status(200).json({message:"Вход выполнен успешно!"})

    }catch(err){
        console.log(err)
        res.status(500).json({message:"Не удалось войти"})
    }
}

export const logout = (req,res)=>{
    res.clearCookie("token").status(200).json({message:"Выход выполнен успешно"})

}

Когда я заполняю форму, я хочу видеть “Пользователь успешно вошел” в консоли, однако я получаю ошибку axios, пожалуйста, помогите, если вы знаете, что нужно исправить

Ответ или решение

Для решения проблемы с ошибкой сети Axios, которая, как вы подозреваете, является ошибкой CORS, давайте рассмотрим возможные шаги по устранению неисправности. Ошибка может возникать по нескольким причинам, и важно пройтись по всем возможным решениям.

1. Настройка CORS

Поскольку вы используете библиотеку CORS в вашем приложении на Express, убедитесь, что настройки корректны:

В вашем файле app.js, вы уже используете:

app.use(cors({
    origin: process.env.CLIENT_URL, // Убедитесь, что это соответствует URL вашего фронтенда
    credentials: true,
    methods: ["GET", "POST", "PUT", "DELETE"]
}));

Убедитесь, что переменная окружения CLIENT_URL действительно равна http://localhost:5173, и что она загружается корректно. Вы можете временно заменить process.env.CLIENT_URL на строку:

origin: "http://localhost:5173"

2. Проверка наличия ошибок на стороне клиента

Убедитесь, что вы правильно обрабатываете ошибок в вашем компоненте Register:

catch (err) {
    console.log(err); // Это должно выводить ошибку в консоль
    setError(err.response ? err.response.data.message : "Произошла ошибка сети");
}

Это улучшит отладку, так как теперь вы сможете увидеть ошибки, которые могли быть упущены.

3. Проверьте, работает ли сервер

Убедитесь, что ваш сервер запущен и доступен по адресу http://localhost:8000. Вы можете сделать это, открыв этот адрес в браузере или отправив запрос с помощью Postman.

4. Проверьте, правильно ли настроен Axios

Убедитесь, что вы правильно настраиваете вашу Axios конфигурацию. Убедитесь, что заголовки запроса корректно установлены. Это может быть полезно, если вы делаете что-то пользовательское.

Если вы используете cookie для авторизации, убедитесь, что у вас правильные настройки в отношение cookie. Параметр httpOnly не позволяет JavaScript получить доступ к cookie, что может быть важным для анализа.

6. Запуск кросс-доменных запросов

Попробуйте закомментировать параметр { withCredentials: true } и посмотрите, исчезнет ли ошибка. Однако если ваш сервер требует определения кросс-доменных запросов для работы с cookies, вам придется оставить его включенным.

7. Другие факторы

  • Убедитесь, что расширения браузера или антивирусные программы не блокируют ваши запросы.
  • Попробуйте использовать другой браузер или режим инкогнито.

Пример полного кода обработчика ошибок

Ваша функция handleSubmit может выглядеть так:

const handleSubmit = async (e) => {
    e.preventDefault();
    const formData = new FormData(e.target);
    const username = formData.get("username");
    const email = formData.get("email");
    const password = formData.get("password");

    try {
        const res = await axios.post("http://localhost:8000/api/auth/register", {
            username,
            email,
            password
        }, { withCredentials: true });

        console.log(res.data);
        navigate("/login"); // Перенаправить после успешной регистрации
    } catch (err) {
        console.log(err);
        setError(err.response ? err.response.data.message : "Произошла ошибка сети");
    }
};

Следуя этим шагам и проверяя каждое из указанных направлений, вы должны суметь определить причину ошибки и решить её. Если после всех коррекций проблема не исчезла, рекомендую обратиться к логам вашего сервера, а также проводить отладку через инструмент разработчика браузера, чтобы выявить дополнительные детали ошибки.

Оцените материал
Добавить комментарий

Капча загружается...