Почему нельзя поставить koa-router перед koa-cors?

Я использую Koa с Node.js 8.1.

Сегодня я обнаружил, что в моем app.js, если я напишу в этом порядке:

const Koa = require('koa')
var cors = require('koa-cors')
const app = new Koa()

app.use(cors(options))
app.use(router.routes())

Корс может работать. Я могу проверить результат, отправив заголовок origin в Postman, и получить

Access-Control-Allow-Origin

как заголовок ответа.

Однако, если я напишу в таком порядке:

const Koa = require('koa')
var cors = require('koa-cors')
const app = new Koa()

app.use(router.routes())
app.use(cors(options))

корс будет работать некорректно.

В чем проблема? Я что-то упускаю?


person guo    schedule 27.06.2017    source источник
comment
Если он работает аналогично Express, заголовки CORS должны быть установлены до, когда маршрутизатор будет вызван для обработки запроса.   -  person robertklep    schedule 27.06.2017


Ответы (2)


Если вы знаете, что делает app.use(), вы поймете, что произошло.

Что делает функция use():

use(fn) {
    this.middleware.push(fn);
    return this;
}

Таким образом, последовательность вашего кода повлияет на процесс обработки запроса. Сначала он направит ваш запрос на ваш бизнес-код и ответит, cors не будет выполнен.

Обычно app.use(router.routes()) должно быть последним промежуточным ПО.

person Li Chunlin    schedule 27.06.2017
comment
Не могли бы вы объяснить больше о том, что сначала ваш запрос будет направлен на ваш бизнес-код и ответит, что cors не будет выполнен? Есть ли какие-либо воспроизводимые доказательства того, что cors не выполняется? - person guo; 27.06.2017
comment
@guo `'использовать строгое'; const Koa = требуется ('koa'); const приложение = новый Коа(); const myCors = function(ctx, next) { console.log('cors do something...'); следующий(); } const myRouter = function(ctx, next) { console.log('бизнес-логика...'); ctx.body = ответить на некоторые данные; } app.use(myRouter); app.use(myCors); app.listen(3001); ` Вы можете попробовать этот очень простой экземпляр, а затем обменяться двумя промежуточными программами и повторить попытку. Предлагаем вам прочитать руководство по koa, чтобы понять промежуточное ПО. - person Li Chunlin; 27.06.2017

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

person amilete    schedule 27.06.2017