Usiłuję obsługiwać CORS w mojej aplikacji Node.js korzystającej z frameworka internetowego Express.js. Przeczytałem dyskusję grupy Google na temat tego, jak sobie z tym poradzić i przeczytałem kilka artykułów o tym, jak działa CORS. Najpierw zrobiłem to (kod jest napisany w składni CoffeeScript):
app.options "*", (req, res) ->
res.header 'Access-Control-Allow-Origin', '*'
res.header 'Access-Control-Allow-Credentials', true
# try: 'POST, GET, PUT, DELETE, OPTIONS'
res.header 'Access-Control-Allow-Methods', 'GET, OPTIONS'
# try: 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept'
res.header 'Access-Control-Allow-Headers', 'Content-Type'
# ...
Wydaje się, że to nie działa. Wygląda na to, że moja przeglądarka (Chrome) nie wysyła początkowego żądania OPTIONS. Kiedy właśnie zaktualizowałem blok zasobu, muszę przesłać żądanie GET krzyżowania do:
app.get "/somethingelse", (req, res) ->
# ...
res.header 'Access-Control-Allow-Origin', '*'
res.header 'Access-Control-Allow-Credentials', true
res.header 'Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS'
res.header 'Access-Control-Allow-Headers', 'Content-Type'
# ...
Działa (w Chrome). Działa to również w przeglądarce Safari.
Przeczytałem, że ...
W przeglądarce implementującej CORS każde żądanie GET lub POST pochodzące z różnych źródeł poprzedza żądanie OPTIONS, które sprawdza, czy GET lub POST jest w porządku.
Więc moje główne pytanie brzmi: dlaczego tak się nie dzieje w moim przypadku? Dlaczego mój blok app.options nie jest wywoływany? Dlaczego muszę ustawić nagłówki w głównym bloku app.get?
źródło
Odpowiedzi:
Aby odpowiedzieć na twoje główne pytanie, specyfikacja CORS wymaga tylko wywołania OPTIONS poprzedzającego POST lub GET, jeśli POST lub GET zawiera nie-prostą treść lub nagłówki.
Typy treści, które wymagają żądania CORS przed lotem (wywołanie OPTIONS), to dowolne typy treści, z wyjątkiem następujących :
application/x-www-form-urlencoded
multipart/form-data
text/plain
Wszelkie inne typy treści oprócz wymienionych powyżej spowodują żądanie przed lotem.
Jeśli chodzi o Nagłówki, wszelkie Nagłówki Żądania oprócz poniższych wywołują żądanie przed lotem:
Accept
Accept-Language
Content-Language
Content-Type
DPR
Save-Data
Viewport-Width
Width
Wszelkie inne nagłówki żądań wywołają żądanie poprzedzające lot.
Możesz więc dodać niestandardowy nagłówek, taki jak
x-Trigger: CORS
:, który powinien wywołać żądanie przed lotem i nacisnąć blok OPCJE.Zobacz MDN Web API Reference - CORS Wstępnie sprawdzone żądania
źródło
OPTIONS
bloki nie wysyłają. Byłoby miło, gdyby miał listę zaakceptowanychHEADERS
lubcontent-types
wymagającychOPTIONS
, itd., Ale to dobry początekUważam, że najprostszym sposobem jest użycie node.js pakiet Cors . Najprostsze użycie to:
Istnieje oczywiście wiele sposobów skonfigurowania zachowania do własnych potrzeb; powyższa strona zawiera szereg przykładów.
źródło
cors({credentials: true, origin: true})
Spróbuj przekazać kontrolę do następnej pasującej trasy. Jeśli Express najpierw dopasowuje trasę app.get, to nie przejdzie do trasy opcji, chyba że to zrobisz (pamiętaj o użyciu następnej) :
Jeśli chodzi o organizowanie rzeczy CORS, umieściłem je w oprogramowaniu pośrednim, które działa dobrze dla mnie:
źródło
config.allowedDomains
łańcuch rozdzielany przecinkami lub tablica?Aby pozostać w tej samej idei routingu. Używam tego kodu:
Podobne do przykładu http://enable-cors.org/server_expressjs.html
źródło
zrobić
i po prostu dodaj te wiersze do głównego pliku, do którego kierowane jest Twoje żądanie (zachowaj go przed każdą trasą).
źródło
app.options('*', cors())
// dołącz przed innymi trasamiStworzyłem pełniejsze oprogramowanie pośrednie odpowiednie do ekspresowego lub połączenia. Obsługuje
OPTIONS
prośby o sprawdzenie podczas inspekcji wstępnej. Zauważ, że pozwoli to CORSowi na dostęp do czegokolwiek, możesz chcieć sprawdzić, czy chcesz ograniczyć dostęp.źródło
zainstaluj moduł cors w expressjs. możesz wykonać następujące kroki>
Instalacja
Proste użycie (Włącz wszystkie żądania CORS)
Aby uzyskać więcej informacji, przejdź do https://github.com/expressjs/cors
źródło
TypeError: Cannot read property 'headers' of undefined
Najbardziej podstawowa konfiguracja aplikacji.Zrób coś takiego:
źródło
Testy przeprowadzone z ekspresowym + węzłem + jonowym działającym w różnych portach.
Localhost:8100
Localhost:5000
źródło
najpierw po prostu zainstaluj cors w swoim projekcie. Weź terminal (wiersz polecenia)
cd
do katalogu projektu i uruchom poniższe polecenie:Następnie weź plik server.js i zmień kod, aby dodać w nim następujące elementy:
To działało dla mnie ..
źródło
cors
jeśli robisz teres.header
rzeczy.cors
to biblioteka, która obsługuje to wszystko za Ciebie. Usuń pierwszą i trzecią linię (AKA wszystko zcors
), a przekonasz się, że nadal działa.res.header("Access-Control-Allow-Origin", "*");
Działa to dla mnie, ponieważ jest to łatwa implementacja w obrębie tras, używam meanjs i działa dobrze, safari, chrome itp.
źródło
Jakiś czas temu napotkałem ten problem, więc zrobiłem to, aby umożliwić CORS w mojej aplikacji nodejs:
Najpierw musisz zainstalować
cors
, używając poniższego polecenia:Teraz dodaj następujący kod do pliku początkowego aplikacji, takiego jak (
app.js or server.js
)źródło
W moim
index.js
dodałem:źródło
Access-Control-Allow-Origin = *
oznacza, że nie będziesz mógł wysyłać plików cookie na serwer, zostaną one odrzucone przez zasady CORS - źródło: developer.mozilla.org/en-US/docs/Web/HTTP/… . Więc nie używaj tego, jeśli chcesz korzystać z plików cookie.Jeśli chcesz, aby był specyficzny dla kontrolera, możesz użyć:
Pamiętaj, że pozwoli to również na użycie ramek iframe.
źródło
Może odnieść się do kodu poniżej dla tego samego. Źródło: Academind / node-restful-api
źródło
const app = express();
i działa! Myślę, że należy o tym wspomnieć.Moje najprostsze rozwiązanie z Express 4.2.0 (EDYCJA: Wydaje się, że nie działa w 4.3.0) to:
Podejrzewam,
app.all('/result', ...)
że działanie też by działało ...źródło
Najprostszą odpowiedzią jest użycie pakietu cors .
Umożliwi to CORS na całej planszy. Jeśli chcesz dowiedzieć się, jak włączyć CORS bez modułów zewnętrznych , tak naprawdę potrzebujesz tylko ekspresowego oprogramowania pośredniego, które ustawia nagłówek „Kontrola dostępu - Zezwalaj na pochodzenie” . Jest to minimum potrzebne do zezwolenia na domeny z żądaniami krzyżowymi z przeglądarki na serwer.
źródło
Korzystanie z Express Middleware działa dla mnie świetnie. Jeśli już korzystasz z Express, po prostu dodaj następujące reguły oprogramowania pośredniego. Powinno zacząć działać.
Odniesienie
źródło
Poniżej działało dla mnie, mam nadzieję, że to komuś pomoże!
Otrzymałem referencję od https://expressjs.com/en/resources/middleware/cors.html#configuring-cors
źródło
Przekonałem się, że jest to niezwykle łatwe dzięki pakietowi żądania npm ( https://www.npmjs.com/package/request )
Następnie oparłem swoje rozwiązanie na tym poście http://blog.javascripting.com/2015/01/17/dont-hassle-with-cors/
źródło
W maszynopisie, jeśli chcesz używać node.js pakiet Cors
Jeśli nie chcesz używać bibliotek trzeciej części do obsługi błędów cors, musisz zmienić metodę handleCORSErrors ().
Do korzystania z pliku app.ts
źródło
Jest to podobne do odpowiedzi Pat z tą różnicą, że kończę na res.sendStatus (200); zamiast next ();
Kod przechwytuje wszystkie żądania typu metody OPTIONS i odsyła nagłówki kontroli dostępu.
Kod akceptuje CORS ze wszystkich źródeł, zgodnie z żądaniem w pytaniu. Lepiej byłoby jednak zastąpić * określonym źródłem, np. Http: // localhost: 8080, aby zapobiec niewłaściwemu użyciu.
Ponieważ używamy metody app.options zamiast metody app.use, nie musimy tego sprawdzać:
co możemy zobaczyć w niektórych innych odpowiedziach.
Znalazłem odpowiedź tutaj: http://johnzhang.io/options-request-in-express .
źródło
Możesz korzystać z oprogramowania pośredniego Express, blokować domenę i metody.
źródło
Możemy uniknąć CORS i zamiast tego przesłać żądania do innego serwera:
źródło
W swojej aplikacji internetowej wykonałem następujące kroki i odniosłem sukces:
Dodaj pakiet cors do ekspresu:
Dodaj następujące wiersze po konfiguracji bodyParser . Miałem pewne problemy z dodaniem przed bodyParser:
źródło
Najprostszym podejściem jest instalacja modułu cors w projekcie za pomocą:
Następnie w pliku serwera zaimportuj go, wykonując następujące czynności:
Następnie użyj go jako takiego oprogramowania pośredniego:
Mam nadzieję że to pomoże!
źródło
Gdybym był na @OP, zmieniłbym mój paradygmat programowania.
zakładając, że blokujesz te CORS, ponieważ wysyłasz żądania do localhost lub czegoś podobnego.
W końcu, jeśli zamierzasz wdrożyć optoiny produkcyjne, takie jak
Google Cloud Platform
lubHeroku
lub, nie będziesz musiał martwić się o CORS, takie jak zezwolenie na pochodzenie lub cokolwiek innego podczas produkcji.więc podczas testowania serwera po prostu użyj
postman
i nie dostaniesz blokady CORS, po tym wdróż serwer, a następnie pracuj na kliencie.źródło
/ * po pierwsze, i może to być problem wśród młodszych deweloperów, takich jak ja: pamiętaj, aby użyć metody „lambda” >>>> „'”, a nie „” w metodzie pobierania ! * /
`` `const response = czekaj na fetch (
https://api....
);/ plus, wysoce zalecany jest następujący artykuł: https://developer.edamam.com/api/faq /
źródło
proste jest trudne:
źródło
Wypróbuj to w swoim głównym pliku js:
To powinno rozwiązać twój problem
źródło