- Вопрос или проблема
- Ответ или решение
- 1. Настройка CORS
- 2. Проверка наличия ошибок на стороне клиента
- 3. Проверьте, работает ли сервер
- 4. Проверьте, правильно ли настроен Axios
- 5. Проверьте, правильно ли настроены cookie
- 6. Запуск кросс-доменных запросов
- 7. Другие факторы
- Пример полного кода обработчика ошибок
Вопрос или проблема
Когда я заполняю форму регистрации, у меня возникает ошибка сети 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 конфигурацию. Убедитесь, что заголовки запроса корректно установлены. Это может быть полезно, если вы делаете что-то пользовательское.
5. Проверьте, правильно ли настроены cookie
Если вы используете 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 : "Произошла ошибка сети");
}
};
Следуя этим шагам и проверяя каждое из указанных направлений, вы должны суметь определить причину ошибки и решить её. Если после всех коррекций проблема не исчезла, рекомендую обратиться к логам вашего сервера, а также проводить отладку через инструмент разработчика браузера, чтобы выявить дополнительные детали ошибки.