如何在使用restify时支持cors

时间:2013-01-15 13:21:02

标签: node.js cors restify

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

14 个答案:

答案 0 :(得分:63)

最新版Restify提供a plugin to handle 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']   

}));

答案 1 :(得分:59)

您必须将服务器设置为设置跨源标头。不确定是否有内置使用功能,所以我自己写了。

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/

答案 2 :(得分:14)

这对我有用:

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

答案 3 :(得分:9)

这对我有用:

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

答案 4 :(得分:6)

不推荐使用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)

答案 5 :(得分:4)

要启用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);

答案 6 :(得分:4)

如果有人在2018年2月遇到此问题,似乎有一个错误被引入,我无法让restify-cors-middleware工作。

我现在正在使用这项工作:

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

答案 7 :(得分:3)

我在我的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方法来推送你想要首先解析的头,然后使用CORS中间件来启动CORS功能。

答案 8 :(得分:3)

以前的大部分答案都是从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);

并添加其他适合您的其他选项。我的用例是在开发期间创建一个localhost代理来解决浏览器CORS问题。仅供参考我使用restify作为我的服务器,但是从服务器(到服务器)的POST是使用Axios。我喜欢那里。

npm listing for restify-cors-middleware

答案 9 :(得分:2)

这足以解决我的问题:

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()次来电。

答案 10 :(得分:1)

这对我来说适用于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();

});

答案 11 :(得分:1)

我正在使用Restify 7.2.3版本,此代码对我非常有效。 您需要安装restify-cors-middleware插件。

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)

答案 12 :(得分:0)

   const cors = require('cors');


   const server = restify.createServer();

   server.use(cors());

这对我有用

答案 13 :(得分:0)

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

...是一种蛮力解决方案,尽管您应该非常小心。