utworzyłem mały interfejs 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 nasłuchuje na porcie 3000, otrzymuję brak kontroli dostępu Allow-Origin ”. Próbowałem używać node-http-proxy
Apache i Vhosts, ale nie odniosłem dużego sukcesu, zobacz pełny błąd i kod poniżej.
XMLHttpRequest nie może załadować localhost: 3000. Żądany zasób nie zawiera nagłówka „Access-Control-Allow-Origin”. Dlatego „localhost: 8888” pochodzenia nie ma dostępu. ”
// 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>
Zaakceptowana odpowiedź jest w porządku, jeśli wolisz coś krótszego, możesz użyć wtyczki o nazwie cors dostępnej dla Express.js
Jest prosty w użyciu, w tym konkretnym przypadku:
źródło
{origin: 'null'}
aby to działało ... Najwyraźniej moja przeglądarka wysyłanull
jako źródło?app.use(cors({origin: '*'}));
pracował dla mnie, jak na Ena-Cors .Innym sposobem jest dodanie nagłówków do trasy:
źródło
)
buźki pomylił mnieTop odpowiedź działało w porządku dla mnie, chyba że muszę whitelist więcej niż jedną domenę.
Również najlepsza odpowiedź cierpi z tego powodu
OPTIONS
żądanie nie jest obsługiwane przez oprogramowanie pośrednie i nie otrzymujesz go automatycznie.Domeny z białej listy przechowuję jak
allowed_origins
w konfiguracji Express i od tego czasu umieszczam poprawną domenę zgodnie zorigin
nagłówkiemAccess-Control-Allow-Origin
nie pozwala na określenie więcej niż jednej domeny.Oto, z czym skończyłem:
źródło
Kod odpowiedzi pozwala tylko na localhost: 8888. Tego kodu nie można wdrożyć w produkcji ani pod inną nazwą serwera i portu.
Aby działał dla wszystkich źródeł, użyj tego zamiast tego:
źródło
Zainstaluj zależność cors w swoim projekcie:
Dodaj do pliku konfiguracyjnego serwera:
Działa dla mnie z wersją cors 2.8.4.
źródło
"cors": "^2.8.5", "express": "^4.16.3",
działa dobrze tylko z sugerowaną linią @monikaja. Dzięki!To zadziałało dla mnie.
Możesz zmienić * w zależności od potrzeb. Mam nadzieję, że to może pomóc.
źródło
Cześć, dzieje się tak, gdy frontend i backend działają na różnych portach. Przeglądarka blokuje odpowiedzi z zaplecza z powodu braku nagłówków CORS. Rozwiązaniem jest dodanie nagłówków CORS do żądania zaplecza. Najprostszym sposobem jest użycie pakietu cors npm.
Umożliwi to nagłówki CORS we wszystkich twoich żądaniach. Więcej informacji można znaleźć w dokumentacji corsa
https://www.npmjs.com/package/cors
źródło
źródło
Dodaj następujący kod do app.js NODEJ Restful api, aby uniknąć błędu „Access-Control-Allow-Origin” w kątowniku 6 lub innym frameworku
źródło
Możesz użyć „$ http.jsonp”
LUB
Poniżej znajduje się obejście dotyczące Chrome do testowania lokalnego
Musisz otworzyć Chrome za pomocą następującego polecenia. (Naciśnij okno + R)
Uwaga: Twój chrom nie może być otwarty. Po uruchomieniu tego polecenia chrome otworzy się automatycznie.
Jeśli wpisujesz to polecenie w wierszu polecenia, wybierz katalog instalacyjny chrome, a następnie użyj tego polecenia.
Poniżej kod skryptu dla otwartego chrome w MAC z „--allow-file-access-from-files”
drugie opcje
Możesz po prostu użyć open (1), aby dodać flagi: open -a „Google Chrome” --args --allow-file-access-from-files
źródło
źródło