Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用restify时如何支持cors_Node.js_Cors_Restify - Fatal编程技术网

Node.js 使用restify时如何支持cors

Node.js 使用restify时如何支持cors,node.js,cors,restify,Node.js,Cors,Restify,我有一个用restify模块创建的restapi,我想允许跨源资源共享。最好的方法是什么?您必须将服务器设置为设置跨源标题。不确定是否有内置函数,所以我写了自己的 server.use( function crossOrigin(req,res,next){ res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "X-Requested-With")

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

您必须将服务器设置为设置跨源标题。不确定是否有内置函数,所以我写了自己的

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

我在本教程中找到了这个

最新版本的Restify提供了

因此,您现在可以这样使用它:

server.use(restify.CORS)({
//默认值为['*']。
来源:['https://foo.com', 'http://bar.com', 'http://baz.com:8081'], 
//默认为false。
证书:正确,
//设置公开标题。
标题:['x-foo']
}));

这就是我的工作原理:

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

我这段代码取自

这在我的情况下就足够了:

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 base应用程序上这样做:

//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功能。

要启用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);
这对我很有用:

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

CORS插件被弃用,取而代之的是。(来源:)

下面是关于如何使用的示例代码

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年,使用了不推荐的示例! 解决方案(至少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作为我的服务器,但是我从服务器(以及到服务器)的帖子是使用Axios的。我更喜欢那里


如果在2018年2月有人遇到这个问题,似乎有一个bug被引入,我无法让
restify cors中间件
工作

我现在正在使用此工作方法:

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

这对我很有效

这对我使用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();

});

我使用的是Restif7.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)

。。。这是一个暴力解决方案,不过您应该非常小心。

有一个问题:哪个版本的restify?(你说的是“restify的最后一个版本……”@Jean MichelTrayaud:这对我不起作用。。。访问控制不允许我获取原点允许原点。任何帮助都将被感激:)我想我们需要更多的信息。。。第一次使用Restify 3.0.3测试GET或POST(POST对CORS来说真是一场噩梦),只使用
resify.CORS()
就足够了。无需使用
restify.fullResponse()
,但在请求中,需要指定
Origin
头。请参阅中的相关代码注释。此插件有一个奇怪的行为。如果原点与数组中的一个匹配,它将在响应头中返回匹配的原点,这是预期的。但是,如果不匹配,它将返回一个通配符。如果您提出认证的cors请求,它仍然会失败,因为这样一来,原产地就不能是*。但为什么要返回*?这对我来说很有效,但我还需要添加
server.use(restify.fullResponse())
上调用
服务器之前,这几乎对我有效。我必须使用
server.opts({path:'/customers',version:'0.0.1'},unknownMethodHandler)。在
打开的情况下,该方法没有被调用。这避免了restify对选项飞行前请求的404“method not allowed”响应。CORS交叉源问题必须单独处理--请参阅“上面的crossOrigin函数解决了这个问题。我使用的是Restifv2.8.3,其中一些头文件在默认情况下已经启用。查看
/node\u modules/restify/lib/plugins/cors.js
中的默认值。打字警告:最后一个需要额外的括号出于某种原因,其他答案对我不起作用。是你的。我想知道这是否与对最新版本的restify所做的更改有关。由于这个答案已经存在了一段时间,而且人们在下面的评论中询问有关版本的其他问题,我想报告,这个答案对我使用restify 4.1.0仍然有效。我使用的是restify 5.0.1,并且找不到关于CORSI的解决方案,请将其与6.0.1一起使用
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 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`));