我有一个使用 restify 模块创建的 REST api,我想允许跨域资源共享。最好的方法是什么?
14 回答
您必须设置服务器以设置跨源标头。不确定是否有内置的使用功能,所以我自己写了。
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/
最新版本的 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 插件已弃用,取而代之的是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)
    如果有人在 2018 年 2 月遇到这个问题,似乎有一个错误已经被引入,我无法让它restify-cors-middleware工作。
我现在正在使用这个工作:
server.pre((req, res, next) => {
   res.header("Access-Control-Allow-Origin", "*");
   next();
});
    为了启用 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);
    我在我的 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 功能。
以前的大多数答案都来自 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 一起使用。我的偏好在那里。
这在我的情况下就足够了:
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()调用之前才能工作。
这对我有用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();
});
    我正在使用 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)
       const cors = require('cors');
   const server = restify.createServer();
   server.use(cors());
这对我有用
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`));
... 是一种蛮力解决方案,尽管您应该非常小心地这样做。