2015-12-16 54 views
1

我已經閱讀了許多文章,並嘗試了幾乎所有我能想到的配置使CORS與restify一起工作。我已將restify.CORS()restify.fullResponse()和其他所有組合一起使用。我也嘗試使用Cors lib(npm install cors)無濟於事。我的應用程序是這樣的:無法使CORS與restify一起工作,所有的預檢選項返回405

/** 
* Setup middlewares. 
*/ 
server.use(restify.queryParser()); 
server.use(restify.bodyParser()); 
server.use(restify.cors()); 
server.use(restify.fullResponse()); 
server.use(morgan('dev')); 

我也嘗試添加OPTS與處理:

server.opts('/\.*/', (req, res, next) => { 
    res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, OPTIONS, DELETE'); 
    res.send(204); 
    return next(); 
}); 

在任何情況下,我得到的結果:

XMLHttpRequest cannot load http://localhost:3000/1.0.0/clients. Response to preflight 
request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is 
present on the requested resource. Origin 'http://run.plnkr.co' is therefore not 
allowed access. The response had HTTP status code 405. 

任何想法?這是與restify 4.0.3。謝謝!

回答

0

使用CORS內置模塊:

server.use(restify.CORS({ 
    origins: ['*'], 
    credentials: false, // defaults to false 
    headers: [''] // sets expose-headers 
})); 

您的解決方案應該工作,以及如果你實際添加的訪問控制允許來源頭部;-)

+0

類型錯誤:restify.CORS是不是一個功能 –

+0

它已經過時:https://github.com/TabDigital/restify-cors-middleware –

0

使用server.opts方法來爲OPTIONS請求提供自己的處理程序。以下是您可以使用的示例。

同時告訴我,如果在從瀏覽器發出請求時使用set-credentials標誌爲true。這種情況下的處理將不得不使用訪問cookie進行響應。

在下面的示例中,我返回準確匹配的允許來源。你可以調整它爲子串匹配。但是總是返回響應頭'Access-Control-Allow-Origin'中的請求頭源中找到的確切值。這是一個很好的做法。

server.opts('/\.*/', (req, res) => { 
const origin = req.header('origin'); 
const allowedOrigins = ['example.com', 'example.org']; 
if (allowedOrigins.indexOf(origin) === -1) { 
    //origin is not allowed 
    return res.send(405); 
} 
//set access control headers to allow the preflight/options request 
res.setHeader('Access-Control-Allow-Origin', header); 
res.setHeader('Access-Control-Allow-Headers', 'Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version'); 
res.setHeader('Access-Control-Allow-Methods', 'GET,POST,PUT,PATCH,DELETE,OPTIONS'); 

// Access-Control-Max-Age header catches the preflight request in the browser for the desired 
// time. 864000 is ten days in number of seconds. Also during development you may want to keep 
// this number too low e.g. 1. 
res.setHeader('Access-Control-Max-Age', 864000); 
return res.send(200); 
相關問題