我怎样才能使用的RESTify时支持CORS(How can I support cors when

2019-07-18 05:39发布

我与的RESTify模块创建一个REST API,我想允许跨域资源共享。 什么是做到这一点的最好方法是什么?

Answer 1:

你必须设置服务器最多设置跨原产头。 不知道是否有一个内置的使用功能或没有,所以我写我自己。

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

我发现这本教程。 http://backbonetutorials.com/nodejs-restify-mongodb-mongoose/



Answer 2:

的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']   

}));


Answer 3:

这对我的作品:

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);
});


Answer 4:

这是对我工作:

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



Answer 5:

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)


Answer 6:

要启用基本身份验证CORS我做了以下。 它没有工作,直到.pre方法,替代了的.use方法

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);


Answer 7:

如果有人遇到这是2018年2月的似乎是已被引入的错误,我不能得到restify-cors-middleware工作。

我使用此解决现在:

server.pre((req, res, next) => {
   res.header("Access-Control-Allow-Origin", "*");
   next();
});


Answer 8:

我不喜欢这样对我的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功能。



Answer 9:

大部分以前的答案是从2013年和使用已停用的例子! 将该溶液(在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);

并添加任何额外的其他选项为你工作。 我用例是创建一个本地主机代理发轫探索过程中绕过浏览器CORS问题。 仅供参考我使用的RESTify作为我的服务器,但后来我的帖子从服务器(和服务器)是爱可信。 我偏爱有。

NPM清单的RESTify-CORS中间件



Answer 10:

这足以在我的情况:

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()调用必须先server.get()调用才能工作。



Answer 11:

这个工作对我的RESTify 7

server.pre((req, res, next) => {

    res.header('Access-Control-Allow-Origin', req.header('origin'));
    res.header('Access-Control-Allow-Headers', req.header('Access-Control-Request-Headers'));
    res.header('Access-Control-Allow-Credentials', 'true');
    // other headers go here..

    if(req.method === 'OPTIONS') // if is preflight(OPTIONS) then response status 204(NO CONTENT)
        return res.send(204);

    next();

});


Answer 12:

我使用的RESTify 7.2.3版本,该代码为我工作得非常好。 您需要安装的RESTify-CORS中间件插件。

const corsMiddleware = require('restify-cors-middleware')

const cors = corsMiddleware({
    preflightMaxAge: 5, //Optional
    origins: ['http://ronnie.botsnbytes.com', 'http://web.myapp.com'],
    allowHeaders: ['API-Token'],
    exposeHeaders: ['API-Token-Expiry']
})

server.pre(cors.preflight)
server.use(cors.actual)


Answer 13:

   const cors = require('cors');


   const server = restify.createServer();

   server.use(cors());

这为我工作



Answer 14:

const restify = require('restify');
const corsMiddleware = require('restify-cors-middleware');

const cors = corsMiddleware({
  origins: ['*']
});

const server = restify.createServer();
server.pre(cors.preflight);
server.use(cors.actual);

server.get('/api/products', (request, response) => {
  response.json({ message: 'hello REST API' });
});

server.listen(3000, () => console.info(`port 3000`));

...是一个蛮力解决方案,但你应该非常小心这样做。



文章来源: How can I support cors when using restify