Odrzucony request do backendu przez CORS

Odrzucony request do backendu przez CORS
G8
  • Rejestracja:ponad 7 lat
  • Ostatnio:około rok
  • Postów:85
0

Po wysłaniu request DELETE do express otrzymuję taki błąd:

Access to XMLHttpRequest at '(tutaj jest URL)' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Ten sam błąd otrzymuję podczas wysłania request z aplikacji na netlify. Nie ma znaczenia czy to localhost czy nie.

Request GET działa bez problemu.

A oto i fragment kodu:

Express:

Kopiuj

const cors = require("cors");
const app = express();
app.use(cors({origin: '*'}));
app.use(express.json());

app.use(function (req, res, next) {

  res.setHeader('Access-Control-Allow-Origin', 'http://localhost:3000');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
  res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
  res.setHeader('Access-Control-Allow-Credentials', true);
  next();
});

app.get("/api/image/:image_id", getImage);
app.delete("/api/image/:image_id", delImage);

React:

Kopiuj
import axios from "axios";

const beStructionApi = axios.create({
  baseURL: "(tutaj URL)",
  headers: {"Access-Control-Allow-Origin": "*"}
});

export const getImage = (image_id) => {
    return beStructionApi.get(`/image/${image_id}`).then((result) => {
      const data = result.data.image.data;
      let TYPED_ARRAY = new Uint8Array(data);

      const STRING_CHAR = TYPED_ARRAY.reduce((data, byte)=> {
        return data + String.fromCharCode(byte);
        }, '');

      let base64String = window.btoa(STRING_CHAR);

      return base64String 
    })
}

export const delImageS3 = (image_id) => {
  return beStructionApi.delete(`/image/${image_id}`).then((result) => {
    console.log(result)
  })
edytowany 4x, ostatnio: Riddle
CP
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 2 lata
  • Postów:103
3

Ten nagłówek header powinien zwracać serwer, po co klient miałby go do serwera wysyłać?

Wysyłaj ten nagłówek jako serwer Access-Control-Allow-Origin: * zamiast localhost:3000, bo prawdopodobnie react masz na jakimś innym porcie, jakbyś serwował statyczne pliki z express to by nie było trzeba żadnych CORS zmieniać.


Bierzcie i pożywajcie się wiedzą
Xarviel
  • Rejestracja:ponad 3 lata
  • Ostatnio:około godziny
  • Postów:847
3

Przyjrzyj się dokładnie na te dwa middlewary, bo jeden nadpisuje drugi

Glt87 napisał(a):
Kopiuj
app.use(cors({origin: '*'}))
// ...
app.use(function (req, res, next) {
  res.setHeader('Access-Control-Allow-Origin', 'http://localhost:3000');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
  res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
  res.setHeader('Access-Control-Allow-Credentials', true);
  next();
});
G8
  • Rejestracja:ponad 7 lat
  • Ostatnio:około rok
  • Postów:85
0

Problem DELETE request rozwiązany ale pojawił się kolejny z POST a mianowicie kiedy wysyłam zdjęcie w body to słusznie otrzymuję axios error status code 413 bo plik jest za duży (413kb) a z tego co wyczytałem default max size w express to 100kb. Kiedy dodam linijkę kodu, która jak mi się przynajmniej wydaje, powinna zwiększyć ten limit to znowu dosteję 'Access to XMLHttpRequest has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.'''

Kopiuj
app.use(cors({origin: '*'}));
app.use(express.json());
app.use(bodyParser.json({limit: '5mb'})); //<- dodana linia

Czy ktoś może mi powiedzieć co robię źle z tym middleware?

Xarviel
  • Rejestracja:ponad 3 lata
  • Ostatnio:około godziny
  • Postów:847
0
Xarviel napisał(a):

Przyjrzyj się dokładnie na te dwa middlewary, bo jeden nadpisuje drugi

Glt87 napisał(a):

app.use(express.json());
app.use(bodyParser.json({limit: '5mb'})); //<- dodana linia

Kopiuj

https://expressjs.com/en/api.html#express.json

Musisz się zdecydować na

Kopiuj
app.use(express.json({ limit: "500kb" }));

lub

Kopiuj
app.use(bodyParser.json({ limit: '500kb'}));
edytowany 2x, ostatnio: Xarviel
G8
Dzięki. Juz to ogarnąłem
G8
  • Rejestracja:ponad 7 lat
  • Ostatnio:około rok
  • Postów:85
0

Wracając do mojego POST request. Wiecie może dlaczego wysyłam w body string zaczynający się:

Kopiuj
data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC

a jak zrobie po niego GET request to wraca:

Kopiuj
data:image/jpeg;base64,ZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwvOWovNEFBUVNrWkpSZ0FCQVFBQUFRQUJBQUQvMndCREFBWUVCUVlGQkFZR0JRWUhCd1lJQ2hBS0Nna0pDaFFPRHd3UUZ4U

i nie wgrywa się z tego stringa żaden obraz. ;)

edytowany 1x, ostatnio: Riddle
8cc84b
  • Rejestracja:około 2 lata
  • Ostatnio:11 dni
  • Postów:7
2
Glt87 napisał(a):

Wracając do mojego POST request. Wiecie może dlaczego wysyłam w body string zaczynający się:

Kopiuj
data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC

a jak zrobie po niego GET request to wraca:

Kopiuj
data:image/jpeg;base64,ZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwvOWovNEFBUVNrWkpSZ0FCQVFBQUFRQUJBQUQvMndCREFBWUVCUVlGQkFZR0JRWUhCd1lJQ2hBS0Nna0pDaFFPRHd3UUZ4U

i nie wgrywa się z tego stringa żaden obraz. ;)

Nie wiem dlaczego, ale zauważyłem inny problem i do niego zrobię follow-up. Wysyłanie, czy odsyłanie obrazka w formacie base64 jako string jest złą praktyką. Trzymanie takiego stringa w bazie (o ile to robisz), również jest anti-patternem. Istnieje takie narzędzie jak Multer. Zapoznaj się z nim.

edytowany 1x, ostatnio: Riddle
Xarviel
Jeśli chodzi o zapis do bazy to zamiast base64 można zapisać zwykłą ścieżkę do pliku
8cc84b
Na pewno to będzie lepsze, ale nie spotkałem się z tym nigdy. Jeśli jest to stałe miejsce, w którym zapisywane są jakiejś konkretne pliki, to tak naprawdę starczy w configu zdefiniować base path, a w bazie można trzymać zahashowaną nazwę tego pliku (i ewentualnie inne dane, które mogą się przydać) i to w sumie jest wystarczające.
G8
Dzięki. Już wszystko działa. Multer z tego co widzę działa w node. String zmieniał się bo dodatkowo był formatowany po otrzymaniu z s3. Do s3 muszę wgrać całe obrazy, zauważyłem że przy upload zmieniają się w array bufffer.
8cc84b
@Glt87: Spoko. Jeśli korzystasz z S3, to pewnie używasz paczki aws-sdk? Jeśli tak, to paczka ta umożliwa Ci streamowanie pliku bezpośrednio z AWS. Nie musisz wtedy w ogóle bawić się z bufferem i generalnie cała obsługa pliku Ciebie wtedy nie obchodzi. Jedynie musisz mieć gdzieś zapisany file path do AWS. Polecam sobie gdzieś taką uniwersalną metodę napisać, bo zrobisz to raz, a potem możesz użyć jej gdziekolwiek.
G8
  • Rejestracja:ponad 7 lat
  • Ostatnio:około rok
  • Postów:85
0

Znowu pojawił sie problem z CORS. Pomimo tego, że nie zmieniłem w ogóle kodu, express zaczął blokować http:localhost:3000. Aplikacja, która już jest w netlify działa normalnie. Czy ktoś wie o co może chodzić? Czy może mieć znaczenie że netlify jest https a localhost http?

8cc84b
ale żadna metoda HTTP nie działa, czy nie działają tylko te, które mają jakieś body?
8cc84b
To nie wiem ;/
FG
  • Rejestracja:około 5 lat
  • Ostatnio:około miesiąc
  • Postów:57
0

Pamiętaj, że CORS oznacza, że to serwer nie akceptuje żądania z domeny na której masz klienta.
Napisz na jakim adresie masz aplikację, a na jakim wystawiasz serwer express.

Jeśli chodzi o obrazki to powinieneś ustawiać w src adres do zasobów. Automatycznie wykona się wtedy request GET w celu pobrania obrazka. Do tego pamiętaj, że GET jest cacheowany przez przeglądarkę, dzięki czemu jeśli nic się nie zmieni to przy kolejnym odświeżeniu zawartość pójdzie z cache'a, a nie będzie ciągnięta z serwera.

G8
express: https://struction-backend.cyclic.app/ react: https://struction.netlify.app/ w tym momencie mam w express app.use(cors({origin: '*'})); z netlify nie ma żadnego problemu, z localhost blokuje wszystko
CP
Przeglądarka odrzuca CORS chroniąc użytkownika, gdyż serwer przeglądarce nie zezwalał na wysyłanie z innych adresów. Jak zrobisz takie zapytanie curlem, to serwer może ci pisać, że nie wolno, ale i tak zaakceptuje :>
FG
  • Rejestracja:około 5 lat
  • Ostatnio:około miesiąc
  • Postów:57
0

Zakładam, że w takim razie lokalnie odpalasz na HTTP. Jeśli serwer jest na HTTPS to możesz do niego uderzyć tylko z HTTPS. Musisz odpalić swoją aplikację lokalną na HTTPSie i powinno śmigać. Pewnie śmigało Ci wcześniej, bo serwer express miałeś na HTTP.

edytowany 1x, ostatnio: FrontendGuy
G8
sprawdze, dzieki
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)