#javascript #node.js #api #express #cors
Вопрос:
у меня есть эта ошибка:
Доступ к XMLHttpRequest по адресу ‘http://localhost:3000/api/users/uploadAvatar» от происхождения «http://localhost:8081» заблокирован политикой CORS: на запрошенном ресурсе отсутствует заголовок «Управление доступом-Разрешить-Происхождение».
когда мои параметры cors сервера:
app.use((req, res, next) => {
res.header("Access-Control-Allow-Origin", "http://localhost:8081");
res.header("Access-Control-Allow-Credentials", "true");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
if (req.method === 'OPTIONS') {
res.header("Access-Control-Allow-Methods", "PUT, POST, DELETE, GET");
return res.status(200).json({});
}
next();
});
И с внешнего интерфейса я вызываю сервер с этими опциями:
var data = {
image: imageCrop.current.getImage().toDataURL(),
target: targetImage,
}
var config = {
onUploadProgress: function (progressEvent) {
var percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total)
setUploadPercent(percentCompleted)
},
headers: authHeader(),
withCredentials: true,
}
axios.post('uploadAvatar', data ,config).then((res) => {
setUploadPercent(0);
if (res.status === 200) {
cogoToast.success("upload is completed")
setUploadModal(false);
upDateuserInfo();
}
}).catch((err) => {
setUploadPercent(0);
setUploadModal(false);
});
Служба заголовка аутентификации предоставляется с:
export default function authHeader() {
const user = JSON.parse(localStorage.getItem("user"));
if (user amp;amp; user.accessToken) {
// For Spring Boot back-end
// return { Authorization: "Bearer " user.accessToken };
// for Node.js Express back-end
return { Authorization: "Bearer " user.accessToken};
} else {
return {};
}
}
Что я делаю не так?? пожалуйста, помогите мне!!! p.s. вызов работает, если я удаляю параметр изображения, и я не могу установить «Управление доступом-Разрешить-Происхождение»,»*», потому что это даст мне ошибку при использовании подстановочного знака.
Комментарии:
1. По соображениям безопасности интерфейсным веб-страницам не разрешается отправлять запросы на серверы, отличные от того, с которого они исходят. Это называется CORS. Насколько я понимаю, вы делаете запрос с начальной страницы, предоставленной localhost:8081, на localhost:3000 (которые являются двумя отдельными серверами в соответствии с вашим браузером), поэтому это вступает в игру. Вместо этого вам следует сделать запрос с вашего интерфейса на его серверную часть на локальном хосте:8081, затем попросите серверную часть localhost:8081 отправить запрос на локальный хост:3000.
2. @fin444 спасибо за ваш ответ, но как я могу переадресовывать звонки с внутреннего локального хоста:8081 на локальный хост:3000 с помощью React?
3. Можете ли вы загрузить свой проект в такое место, как Github, и связать его? У меня возникли проблемы с полным пониманием того, как взаимодействуют ваш клиент и сервер.
4. спасибо @fin444 за ваше предложение, я сделал это, поставив прокси на сторону реакции! Большое спасибо!
Ответ №1:
я решил поместить эту строку в package.json:
"proxy": "http://localhost:3000/api/"