web-dev-qa-db-ja.com

restifyを使用するときにcorsをサポートするにはどうすればよいですか

Restifyモジュールで作成したREST apiがあり、クロスオリジンリソース共有を許可したいのですが、これを行う最良の方法は何ですか?

44
Kim

クロスオリジンヘッダーを設定するには、サーバーを設定する必要があります。組み込みの使用関数があるかどうかわからないので、自分で書きました。

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/

60
Stephen Reid

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

}));
63

これは私のために働く:

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

これは私のために働いたものです:

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 から取得しました

9
Pavel Nikolov

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)
6
techgyani

2018年2月の時点で誰かがこれに遭遇した場合、導入されたバグがあるようで、restify-cors-middleware動作します。

私は今のところこの回避策を使用しています:

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

基本認証で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);
4
Mel

過去の回答のほとんどは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を使用していますが、サーバー(およびサーバー)からのPOST)はAxiosを使用しています。

restify-cors-middlewareのnpmリスト

3
MattC

私は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メソッドを使用して、ヘッダーuを最初に再表示し、次にCORSミドルウェアを使用してCORS機能を起動する必要があります。

3
Lyman Lai

私の場合、これで十分です。

_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()の呼び出しの前に動作する必要があるようです。

2
Julian A.

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)
1
Ricardo Suárez

これは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();

});
1
vedsmith92
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`));

...はブルートフォースソリューションの1つですが、慎重に行う必要があります。

0
James Shapiro
   const cors = require('cors');


   const server = restify.createServer();

   server.use(cors());

これは私のために働いた

0