2017-06-27 90 views
0

我使用Koa和Node.js 8.1。爲什麼koa-cors不能放在koa-cors之前?

今天,我發現,在我的app.js,如果我寫的順序是:

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

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

的CORS能正常工作。我可以通過在發送郵差頭origin驗證結果,並獲得

訪問控制允許來源

作爲應答報頭。

但是,如果我寫的順序是:

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

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

CORS將無法正常工作。

這裏有什麼問題? AM我錯過了什麼?

+0

如果它的工作方式與Express相似,則需要在路由器被調用來處理請求時設置CORS頭。 – robertklep

回答

2

如果你知道app.use()做什麼,你會明白髮生了什麼。

什麼use()功能做的是:

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

所以,你的代碼的順序會影響請求處理過程。它會首先將您的請求發送給您的業務代碼並進行響應,cors將不會執行。

通常,app.use(router.routes())應該是最後的中間件。

+0

您能否解釋一下更多關於「t會首先將您的請求路由到您的業務代碼並進行響應,cors將不會被執行。」?是否有任何可複製的證據顯示cors未被執行? – guo

+0

@guo ' 'use strict'; const Koa = require('koa'); const app = new Koa(); const myCors = function(ctx,next){console.log('cors do something ...'); next(); } const myRouter = function(ctx,next){ console.log('business logic ...'); ctx.body =「回覆一些數據」; } app.use(myRouter); app.use(myCors); app.listen(3001); ' 您可以試試這個非常簡單的實例,然後交換兩個中間件並重試。建議您閱讀[koa guide](https://github.com/koajs/koa/blob/master/docs/guide.md)以瞭解中間件 –

1

路由器路由將修改您的請求並對其進行響應,因此需要在此之前設置Cors標頭,否則它將無法工作。

相關問題