axios + node.js + cors: даже запросы OPTIONS не доходят до сервера - PullRequest
1 голос
/ 28 марта 2020

Я использую следующее первое промежуточное программное обеспечение. Из-за заголовка токена первый запрос к серверу является запросом OPTIONS. По какой-то причине после перезагрузки как на стороне клиента, так и на стороне сервера ИНОГДА не определено, что запрос может достигнуть консоли .log ("C") 'и отправить статус 200.

app.use(function(req, res, next) {
        console.log("A")

        res.setHeader("Access-Control-Allow-Origin", "*"); 
        res.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, token");
        res.header('Access-Control-Max-Age', String(60 * 60 * 24 * 365));

        console.log("B")
        if(req.method === 'OPTIONS'){
          console.log("C")
          res.sendStatus(200);
          return res;
        }

        console.log("D")
        next();
      });

Но последующие запросы GET или POST не проходят из-за сообщения:

...has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Но если использовать curl:

curl -I -X OPTIONS http://127.0.0.1:3003/handler

Я всегда получаю нормальный ответ, который показывает все необходимые заголовки для CORS

HTTP/1.1 200 OK
X-Powered-By: Express
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, token
Access-Control-Max-Age: 31536000
Content-Type: text/plain; charset=utf-8
Content-Length: 2
ETag: W/"2-nOO9QiTIwXgNtWtBJezz8kv3SLc"
Date: Sat, 28 Mar 2020 07:24:18 GMT
Connection: keep-alive

С GET, POST запросы аналогичным образом, все в порядке через завиток. Но через браузер (используя топор ios) это не работает. Опять же, это звучит странно, но иногда я что-то исправляю / перезагружаю, запрос может даже быть успешным, но когда я вытягиваю следующий обработчик, например / handler2, все снова падает.

Клиент:

axios.defaults.baseURL = "http://127.0.0.1:3003";
axios.defaults.headers.common["token"] = window.localStorage.token;

window.axios = axios;
axios.post("/user/handler", postData).then(...).catch(...);

Пожалуйста, не говорите о app.use (cors ()) или app.options (...)))

Я сижу на нем Бог уже знает, сколько ... ? перепробовал все возможное. Но я думаю, что проблема из-за клиента, а не сервера ... В конце концов, для curl это работает.

1 Ответ

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

Мой стандартный размер токена составляет 8 КБ, но в Node.js --max-http-header-size также равен 8 КБ. Чтобы это исправить, вам нужно написать в пакете. json:

 "scripts": {
    "start": "NODE_OPTIONS=--max-http-header-size={YOUR HEADER SIZE} ts-node src/index.ts",
    "watch": "nodemon"
  },

(Это было недетерминировано c из-за того, что размер токена иногда мог быть немного меньше 8 КБ, может быть )

...