Brak' Access-Control-Allow-Origin ' - Problem Z Węzłem / Portem Apache
Stworzyłem małe API za pomocą Node / Express i próbuję pobrać dane za pomocą Angularjs, ale ponieważ moja strona html działa pod apache na localhost: 8888,a API węzła jest listen na porcie 3000, otrzymuję brak 'Access-Control-Allow-Origin'. Próbowałem używać node-http-proxy
i vhosts Apache, ale nie odniosłem większego sukcesu, zobacz pełny błąd i Kod poniżej.
XMLHttpRequest nie może załadować localhost:3000. Nie ma nagłówka 'Access-Control-Allow-Origin' na żądanym zasoby. Pochodzenie 'localhost: 8888' nie jest zatem dozwolone."
// Api Using Node/Express
var express = require('express');
var app = express();
var contractors = [
{
"id": "1",
"name": "Joe Blogg",
"Weeks": 3,
"Photo": "1.png"
}
];
app.use(express.bodyParser());
app.get('/', function(req, res) {
res.json(contractors);
});
app.listen(process.env.PORT || 3000);
console.log('Server is running on Port 3000')
Kod kątowy
angular.module('contractorsApp', [])
.controller('ContractorsCtrl', function($scope, $http,$routeParams) {
$http.get('localhost:3000').then(function(response) {
var data = response.data;
$scope.contractors = data;
})
HTML
<body ng-app="contractorsApp">
<div ng-controller="ContractorsCtrl">
<ul>
<li ng-repeat="person in contractors">{{person.name}}</li>
</ul>
</div>
</body>
8 answers
Spróbuj dodać następujące oprogramowanie pośrednie do aplikacji NodeJS / Express (dodałem kilka komentarzy dla Twojej wygody):
// Add headers
app.use(function (req, res, next) {
// Website you wish to allow to connect
res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8888');
// Request methods you wish to allow
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
// Request headers you wish to allow
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
// Set to true if you need the website to include cookies in the requests sent
// to the API (e.g. in case you use sessions)
res.setHeader('Access-Control-Allow-Credentials', true);
// Pass to next layer of middleware
next();
});
Mam nadzieję, że to pomoże!Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-19 10:23:25
Accepted answer is fine, in case you prefer something shorter, you may use a plugin called Kors dostępne na ekspres.js
Jest prosty w użyciu, w tym konkretnym przypadku:var cors = require('cors');
// use it before all route definitions
app.use(cors({origin: 'http://localhost:8888'}));
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-18 00:11:24
Innym sposobem jest dodanie nagłówków do trasy:
router.get('/', function(req, res) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'); // If needed
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type'); // If needed
res.setHeader('Access-Control-Allow-Credentials', true); // If needed
res.send('cors problem fixed:)');
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-10 06:32:12
The top answer działał dobrze dla mnie, z wyjątkiem tego, że musiałem dodać więcej niż jedną domenę do białej listy.
Również najlepsza odpowiedź cierpi na fakt, że OPTIONS
żądanie nie jest obsługiwane przez oprogramowanie pośredniczące i nie otrzymujesz go automatycznie.
Przechowuję domeny z białej listy jako allowed_origins
w konfiguracji Express i umieszczam poprawną domenę zgodnie z nagłówkiem origin
, Ponieważ Access-Control-Allow-Origin
nie pozwala określić więcej niż jednej domeny.
Oto z czym skończyłem:
var _ = require('underscore');
function allowCrossDomain(req, res, next) {
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
var origin = req.headers.origin;
if (_.contains(app.get('allowed_origins'), origin)) {
res.setHeader('Access-Control-Allow-Origin', origin);
}
if (req.method === 'OPTIONS') {
res.send(200);
} else {
next();
}
}
app.configure(function () {
app.use(express.logger());
app.use(express.bodyParser());
app.use(allowCrossDomain);
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-01 13:08:21
Kod odpowiedzi pozwala tylko na localhost: 8888. Ten kod nie może zostać wdrożony do produkcji lub innej nazwy serwera i portu.
Aby uruchomić go dla wszystkich źródeł, użyj tego zamiast:
// Add headers
app.use(function (req, res, next) {
// Website you wish to allow to connect
res.setHeader('Access-Control-Allow-Origin', '*');
// Request methods you wish to allow
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
// Request headers you wish to allow
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
// Set to true if you need the website to include cookies in the requests sent
// to the API (e.g. in case you use sessions)
res.setHeader('Access-Control-Allow-Credentials', true);
// Pass to next layer of middleware
next();
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-06 17:31:24
Zainstaluj zależność cors w swoim projekcie:
npm i --save cors
Dodaj do pliku konfiguracyjnego serwera:
var cors = require('cors');
app.use(cors());
Działa u mnie z wersją 2.8.4 cors.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-29 09:21:21
Hi dzieje się tak, gdy front end i backend są uruchomione na różnych portach. Przeglądarka blokuje odpowiedzi z zaplecza ze względu na brak nagłówków CORS. Rozwiązaniem jest dodanie nagłówków CORS w żądaniu zaplecza. Najprostszym sposobem jest użycie pakietu cors npm.
var express = require('express')
var cors = require('cors')
var app = express()
app.use(cors())
Spowoduje to włączenie nagłówków CORS we wszystkich żądaniach. Więcej informacji można znaleźć w dokumentacji cors
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-18 14:01:06
To mi pomogło.
app.get('/', function (req, res) {
res.header("Access-Control-Allow-Origin", "*");
res.send('hello world')
})
Możesz zmienić *, aby dopasować się do swoich potrzeb. Mam nadzieję, że to pomoże.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-15 11:31:11