не работает patch запрос node js react has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource
есть обработчик который передаёт formData в запрос
const handleUpdateProfile = async () => {
try {
const formData = new FormData();
formData.append("id", _id);
formData.append("firstName", formValues.firstName);
formData.append("lastName", formValues.lastName);
formData.append("email", formValues.email);
formData.append("occupation", formValues.occupation);
if (image) {
formData.append("picture", image);
formData.append("picturePath", image.name);
}
formData.forEach((value, key) => {
console.log(`${key}: ${value}`);
});
const response = await fetch(`http://localhost:3001/users/${_id}`, {
method: "PATCH",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: formData,
});
const responseData = await response.json();
console.log("Response from server:", responseData);
//navigate("/home");
} catch (error) {
console.error("Error:", error);
}
};
controller users.js
/* UPDATE */
export const updateUserData = async (req, res) => {
try {
const { id } = req.params;
const updatedUserData = req.body; // Данные для обновления из запроса
console.log(id);
// Проверка существования пользователя
const existingUser = await User.findById(id);
if (!existingUser) {
return res.status(404).json({ message: 'User not found' });
}
// Обновление текущего пользователя
const updatedUser = await User.findByIdAndUpdate(id, updatedUserData, { new: true });
console.log("тут3");
// Обновление данных у друзей (предполагается, что friends - это массив id друзей)
if (updatedUser.friends && updatedUser.friends.length > 0) {
const friendsUpdatePromises = updatedUser.friends.map(async (friendId) => {
const friend = await User.findById(friendId);
if (friend) {
friend.firstName = updatedUserData.firstName || friend.firstName;
friend.lastName = updatedUserData.lastName || friend.lastName;
friend.occupation = updatedUserData.occupation || friend.occupation;
friend.location = updatedUserData.location || friend.location;
friend.picturePath = updatedUserData.picturePath || friend.picturePath;
return friend.save();
}
});
await Promise.all(friendsUpdatePromises);
}
res.status(200).json(updatedUser);
} catch (err) {
res.status(500).json({ message: err.message });
}
};
routes users.js
import express from "express";
import {
getUser,
getUserFriends,
addRemoveFriend,
updateUserData,
} from "../controllers/users.js";
import { verifyToken } from "../middleware/auth.js";
const router = express.Router();
/* READ */
router.get("/:id", verifyToken, getUser);
router.get("/:id/friends", verifyToken, getUserFriends);
/* UPDATE */
router.patch("/:id", verifyToken, updateUserData);
router.patch("/:id/:friendId", verifyToken, addRemoveFriend);
export default router;
код сервера:
/* CONFIGURATIONS */
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
dotenv.config();
const app = express();
app.use(express.json());
app.use(helmet());
app.use(helmet.crossOriginResourcePolicy({ policy: "cross-origin" }));
app.use(morgan("common"));
app.use(express.json({ limit: '50mb' }));
app.use(express.urlencoded({ limit: '50mb', extended: true }));
app.use(cors({
origin: "http://localhost:3000", // Replace with your frontend's URL
methods: "GET,HEAD,PUT,PATCH,POST,DELETE",
credentials: true,
}));
app.use("/assets", express.static(path.join(__dirname, "public/assets")));
/* FILE STORAGE */
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, "public/assets");
},
filename: function (req, file, cb) {
cb(null, file.originalname);
},
});
const upload = multer({ storage });
/* ROUTES WITH FILES */
app.post("/auth/register", upload.single("picture"), register);
app.post("/posts", verifyToken, upload.single("picture"), createPost);
/* ROUTES */
app.use("/auth", authRoutes);
app.use("/users", userRoutes);
app.use("/posts", postRoutes);
app.use("/conversations", conversationRoutes);
app.use("/messages", messageRoutes);
/* MONGOOSE SETUP */
const PORT = process.env.PORT || 6001;
mongoose
.connect(process.env.MONGO_URL, {
useNewUrlParser: true,
useUnifiedTopology: true,
})
.then(() => {
app.listen(PORT, () => console.log(`Server Port: ${PORT}`));
/* ADD DATA ONE TIME */
//User.insertMany(users);
//Post.insertMany(posts);
})
.catch((error) => console.log(`${error} did not connect`));
при нажатии на обновить профиль:enter image description here в чём проблема
если не исползовать FormData всё вроде работает, но без FormData не получается загрузить фото