如何在使用restify时支持cors

我有一个使用restify模块创build的REST API,我想允许跨源资源共享。 什么是最好的办法呢?

您必须将服务器设置为设置交叉源标题。 不知道是否有内置的使用function,所以我写了自己的。

server.use( function crossOrigin(req,res,next){ res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "X-Requested-With"); return next(); } ); 

我从这个教程中find了这个。 http://backbonetutorials.com/nodejs-restify-mongodb-mongoose/

最新版本的Restify提供了一个插件来处理CORS 。

所以你现在可以像这样使用它:

 server.use(restify.CORS({ // Defaults to ['*']. origins: ['https://foo.com', 'http://bar.com', 'http://baz.com:8081'], // Defaults to false. credentials: true, // Sets expose-headers. headers: ['x-foo'] })); 

这适用于我:

 var restify = require('restify'); var server = restify.createServer(); server.use(restify.CORS()); server.opts(/.*/, function (req,res,next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Methods", req.header("Access-Control-Request-Method")); res.header("Access-Control-Allow-Headers", req.header("Access-Control-Request-Headers")); res.send(200); return next(); }); server.get('/test', function (req,res,next) { res.send({ status: "ok" }); return next(); }); server.listen(3000, function () { console.log('%s listening at %s', server.name, server.url); }); 

这对我来说是有效的:

 function unknownMethodHandler(req, res) { if (req.method.toLowerCase() === 'options') { console.log('received an options method request'); var allowHeaders = ['Accept', 'Accept-Version', 'Content-Type', 'Api-Version', 'Origin', 'X-Requested-With']; // added Origin & X-Requested-With if (res.methods.indexOf('OPTIONS') === -1) res.methods.push('OPTIONS'); res.header('Access-Control-Allow-Credentials', true); res.header('Access-Control-Allow-Headers', allowHeaders.join(', ')); res.header('Access-Control-Allow-Methods', res.methods.join(', ')); res.header('Access-Control-Allow-Origin', req.headers.origin); return res.send(204); } else return res.send(new restify.MethodNotAllowedError()); } server.on('MethodNotAllowed', unknownMethodHandler); 

我这个代码是从https://github.com/mcavage/node-restify/issues/284

要启用CORS进行基本身份validation,我做了以下操作。 直到使用.pre方法而不是.pre方法才能工作

 server.pre(restify.CORS({ origins: ['https://www.allowedip.com'], // defaults to ['*'] credentials: true, headers: ['X-Requested-With', 'Authorization'] })); server.pre(restify.fullResponse()); function unknownMethodHandler(req, res) { if (req.method.toLowerCase() === 'options') { var allowHeaders = ['Accept', 'Accept-Version', 'Content-Type', 'Api-Version', 'Origin', 'X-Requested-With', 'Authorization']; // added Origin & X-Requested-With & **Authorization** if (res.methods.indexOf('OPTIONS') === -1) res.methods.push('OPTIONS'); res.header('Access-Control-Allow-Credentials', true); res.header('Access-Control-Allow-Headers', allowHeaders.join(', ')); res.header('Access-Control-Allow-Methods', res.methods.join(', ')); res.header('Access-Control-Allow-Origin', req.headers.origin); return res.send(200); } else { return res.send(new restify.MethodNotAllowedError()); } } server.on('MethodNotAllowed', unknownMethodHandler); 

我这样做我的restify基本应用程序:

 //setup cors restify.CORS.ALLOW_HEADERS.push('accept'); restify.CORS.ALLOW_HEADERS.push('sid'); restify.CORS.ALLOW_HEADERS.push('lang'); restify.CORS.ALLOW_HEADERS.push('origin'); restify.CORS.ALLOW_HEADERS.push('withcredentials'); restify.CORS.ALLOW_HEADERS.push('x-requested-with'); server.use(restify.CORS()); 

您需要使用restify.CORS.ALLOW_HEADERS.push方法将您想要的头部先推入restify,然后使用CORS中间件引导CORS函数。

这在我的情况下是足够的:

 var server = restify.createServer(); server.use(restify.fullResponse()); server.get('/foo', respond(req, res, next) { res.send('bar'); next(); }); 

server.use(restify.CORS());不是必须的server.use(restify.CORS()); 此外,它似乎server.use()调用必须先于server.get()调用才能工作。

CORS插件已被弃用,以支持https://github.com/Tabcorp/restify-cors-middleware 。 (来源: https : //github.com/restify/node-restify/issues/1091 。)

以下是关于如何使用的示例代码

 const corsMiddleware = require('restify-cors-middleware') const cors = corsMiddleware({ preflightMaxAge: 5, //Optional origins: ['http://api.myapp.com', 'http://web.myapp.com'], allowHeaders: ['API-Token'], exposeHeaders: ['API-Token-Expiry'] }) server.pre(cors.preflight) server.use(cors.actual) 

以前的答案大部分都是从2013年开始使用的,并且使用了一些被废弃的例子! 解决scheme(至less在2017年)如下:

 npm install restify-cors-middleware 

然后在你的服务器的JavaScript文件中:

 var corsMiddleware = require('restify-cors-middleware'); var cors = corsMiddleware({ preflightMaxAge: 5, origins: ['*'] }); var server = restify.createServer(); server.pre(cors.preflight); server.use(cors.actual); 

并添加任何额外的其他选项为你工作。 我的用例是在开发过程中创build一个本地代理来解决浏览器CORS问题。 仅供参考我使用restify作为我的服务器,但然后从服务器(和服务器)的POST是与Axios。 我喜欢那里。

npm列出了restify-cors-middleware