无法让CORS与restify一起工作,所有预检OPTIONS都返回405

时间:2015-12-16 07:48:18

标签: node.js cors restify

此时我已经阅读了很多文章,并尝试了我能想到的每一个配置,以使CORS与restify一起工作。我已将restify.fullResponse()/** * Setup middlewares. */ server.use(restify.queryParser()); server.use(restify.bodyParser()); server.use(restify.cors()); server.use(restify.fullResponse()); server.use(morgan('dev')); 以及其他所有组合一起使用。我也尝试过使用cors lib(npm install cors)无济于事。我的应用程序看起来像:

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

我还试过添加opts处理:

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.

在每种情况下,我都会回来:

((MainActivity) mContext).startActivityForResult(main,
                        FragmentCartPreview.MAIL_REQUEST_CODE);

有什么想法吗?这是为了解决4.0.3。谢谢!

2 个答案:

答案 0 :(得分:0)

使用内置模块进行CORS:

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

如果您实际添加了Access-Control-Allow-Origin标头,您的解决方案也应该正常工作; - )

答案 1 :(得分: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);