如何在使用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);
要启用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