如何在使用restify时支持cors

Kim*_*Kim 44 node.js cors restify

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

小智 63

最新版本的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']   

}));
Run Code Online (Sandbox Code Playgroud)

  • 解析哪个版本?(你说"最后一个版本......") (3认同)

Ste*_*eid 61

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

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

我在本教程中找到了这个.http://backbonetutorials.com/nodejs-restify-mongodb-mongoose/


Cyr*_*ith 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);
});
Run Code Online (Sandbox Code Playgroud)


Pav*_*lov 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);
Run Code Online (Sandbox Code Playgroud)

我这段代码取自https://github.com/mcavage/node-restify/issues/284


tec*_*ani 7

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)
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

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