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>
Author: georgeawg, 2013-08-19

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!
 669
Author: jvandemo,
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'}));
 106
Author: Fabiano Soriani,
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:)');
});
 35
Author: Asaf Hananel,
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);
});
 19
Author: Dan Abramov,
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();
});
 13
Author: Vicheanak,
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.

 13
Author: monikaja,
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

Https://www.npmjs.com/package/cors

 11
Author: Karthik,
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.

 7
Author: dmx,
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