#javascript #node.js #angularjs #cors
#javascript #node.js #angularjs #cors
Вопрос:
у меня проблема с загрузкой файлов из клиента angularjs на сервер NodeJS.
Ошибка его:
XMLHttpRequest cannot load http://localhost:801/bill/send-by-email. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8000' is therefore not allowed access.
Другой HTTP-запрос $ работает нормально, но этот нет, это мой клиентский код:
define([], function () {
"use strict";
var UploadService = function (API_URL, $http) {
var uploadFile = function (file, uploadUrl) {
var fd = new FormData();
fd.append('file',file);
return $http({
method: 'POST',
url: API_URL uploadUrl,
headers: {
'Content-Type': 'multipart/form-data'
},
data: {
file: file
},
transformRequest: fd
});
};
return {
uploadFile: uploadFile
};
};
return UploadService;
});
И это серверный код, и перекрестный код:
//Normal express definition
app.use(express.compress());
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(express.bodyParser({limit: '500mb',keepExtensions: true, uploadDir: "uploads" }));
app.use(express.json({limit: '100mb'}));
app.use(express.urlencoded({limit: '100mb'}));
app.use(passport.initialize());
app.use(passport.session());
app.all('*', require('./middleware/logger')(log));
app.all('*', require('./middleware/cors')(log));
Файл cors его:
var env = require('../env');
module.exports = function(log) {
"use strict";
var host = env.host;
log.warn('Configuring Access-Control-Allow-Origin to ' host);
return function(req, res, next) {
res.header("Access-Control-Allow-Origin", host);
res.header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type");
res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
res.header("Access-Control-Allow-Credentials", "true");
next();
};
};
И мой env-файл:
var envs = {
'development' : {
'host' : 'http://localhost:8000',
'sleep': true,
'name': 'development',
'ssl': false
},
'test' : {
'host' : 'edited',
'sleep': false,
'name': 'test',
'ssl': false
},
'production' : {
'host' : 'edited',
'sleep': false,
'name': 'production',
'ssl': true
}
};
var node_env = process.env.NODE_ENV || 'development';
Кто-нибудь знает, в чем проблема?
Комментарии:
1. Другой порт = другое происхождение.
2. Я не делаю что-то другое, как в другом запросе, порт тот же..
3. Ну, приложение на
http://localhost:8000
пытается загрузить содержимое изhttp://localhost:801
. Порт не тот.4. Это потому, что порт 8000 является клиентом angularj, а порт 801 — сервером nodejs.
5. Следовательно, это другой домен. Предоставьте клиенту доступ к серверу с вашими настройками CORS.
Ответ №1:
Вам необходимо разрешить вашему клиенту доступ к CORS, поскольку он находится в другом домене. Поскольку ваши порты разные, браузер и сервер распознают их как независимые домены, не имеющие никакого отношения друг к другу.
res.header("Access-Control-Allow-Origin", 'http://localhost:8000');
Комментарии:
1. Я установил файл env с различными окружениями, у одного из которых локальный хост: 8000
Ответ №2:
Я использую подобное, и это работает
response.setHeader('Content-Type', 'application/json');
response.setHeader('Access-Control-Allow-Origin', '*');
response.setHeader('Access-Control-Allow-Headers', '*');
response.setHeader('Access-Control-Allow-Credentials', 'true');
response.setHeader('X-SERVED-BY', 'Site Name');
попробуйте поместить *
Комментарии:
1. Я установил файл env с различными окружениями, у одного из которых локальный хост: 8000
Ответ №3:
Ошибка, это запрос, он неверен content-type
и возвращает мне эту ошибку. cors
Все было в порядке.
Я отредактировал это:
define([], function () {
"use strict";
var UploadService = function (API_URL, $http) {
var uploadFile = function (file, uploadUrl) {
var fd = new FormData();
fd.append('file', file);
return $http.post(API_URL uploadUrl,fd,{
withCredentials: true,
headers: {'Content-Type': undefined },
transformRequest: angular.identity
});
};
return {
uploadFile: uploadFile
};
};
return UploadService;
});
Ответ №4:
Включите CORS на вашем Node.js
Вот URL, который можно использовать для нескольких конфигураций http://enable-cors.org/server.html
Комментарии:
1. Я это сделал, я описываю, как в вопросе.
2. Вы даже не проверили мой URL, сравните настройки, поскольку ваши явно не работают, не так ли?