Ошибка Firefox CORS с сервером узла express - PullRequest
2 голосов
/ 02 марта 2020

Я использую Express. js с промежуточным ПО CORS. Я получаю очень странное поведение на Firefox v73.0.1 (64-разрядной)

Очистить firefox профиль ... так что ничего не кэшируется.

  1. Я пытаюсь прямой запрос к http://localhost/search?q=AMZN, я получаю результаты, как и ожидалось.
  2. Я открываю свое веб-приложение, которое работает на localhost: 3000. Все эти запросы не используют TLS / SSL.
  3. Я получаю «Заблокирован перекрестный запрос: одна и та же политика происхождения запрещает чтение удаленного ресурса на http://localhost/search?q=AMZN. (Причина: CORS просьба не удалась). когда он пытается связаться с серверным сервером API.
  4. Я ссылаюсь sh на другую вкладку, где у меня был прямой доступ к localhost (тот же запрос, который был выполнен ранее), и я получаю «сброс соединения».

Chrome не делает этого ...

Я смотрю на Wireshark и Firefox просто отправляет запрос GET (несколько из них? Почему ?? I ' я только делаю один), отправляет заголовки и тому подобное, затем следует сброс соединения.

Похоже, что узел делает что-то не так? Или я не знаю.

const express = require('express');
const fetch = require('node-fetch');
const util = require('util');
const app = express();
const port = 80;

var cors = require('cors')

var copts = {
  origin: function (origin, callback) {
      console.log('yeah');
    // allow all
    callback(null, true);
  }
}

const SEARCH_URL = 'https://api.stocktwits.com/api/2/streams/symbol/%s.json';

app.get('/search', cors(copts), (req, res) => {

Часть "да" никогда не затрагивается.

Очень простой клиентский код.

return fetch(BACKEND_URL + uri).then(response => {

Попытался удалить промежуточное ПО CORS и добавил эти заголовки, основанные на изучении кросс-браузерного запроса-ответа github в chrome

    res.header('Access-Control-Allow-Methods', 'GET');
    res.header('Access-Control-Max-Age', '3600');
    res.header('Vary', 'Origin, Access-Control-Request-Headers, Access-Control-Request-Method, Accept-Encoding');
    res.header('Access-Control-Allow-Origin', '*');

У меня не было обработчика обработанных опций, так что, возможно, это не имело значения. Я нашел эти заголовки в ответе GET.

Ответы [ 3 ]

4 голосов
/ 11 марта 2020

Может случиться так, что сервер узла выйдет из строя по недопустимому запросу и, следовательно, вы получите ошибку сброса.

С пакетом cors:

Вам необходимо добавить свойство optionsSuccessStatus в опции cors для некоторых устаревших браузеров. И OPTIONS handler Для включения предварительных запросов.

const express = require('express');
const fetch = require('node-fetch');
const util = require('util');
const app = express();
const port = 80;
var cors = require('cors')
var copts = {
    origin: function (origin, callback) {
        console.log('yeah');
        callback(null, true);
    },
    optionsSuccessStatus: 200
}
app.options("*", cors(copts));
const SEARCH_URL = 'https://api.stocktwits.com/api/2/streams/symbol/%s.json';
app.get('/search', cors(copts), (req, res) => { });

С заголовками .: Вам не хватает Access-Control-Allow-Headers в ответе headers, вам нужно добавить заголовок Access-Control-Allow-Headers в заголовке ответа чтобы разрешить заголовок Access-Control-Allow-Origin.

Попробуйте это.

const express = require('express');
const fetch = require('node-fetch');
const util = require('util');
const app = express();
const port = 80;
var cors = require('cors')
var copts = {
    origin: function (origin, callback) {
        console.log('yeah');
        // allow all
        callback(null, true);
    }
}
const SEARCH_URL = 'https://api.stocktwits.com/api/2/streams/symbol/%s.json';
app.get('/search', (req, res) => { 
    res.header('Access-Control-Allow-Methods', 'GET, OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Origin');
    res.header('Access-Control-Allow-Origin', '*');
    res.status(200).send("Ok")
});


0 голосов
/ 17 марта 2020

попробуйте назначить CORS серверу express следующим образом:

const cors = require('cors');
app.use(cors());
0 голосов
/ 17 марта 2020

Обновили ли вы свой пакет переднего плана. json файл со следующим?

"proxy": "http://localhost:[your port here]/",
...