1

私は完全に外部APIベースのサイトを開発しています。サーバー側のロジックはありません。すべてのデータは外部APIからフェッチされます。バックエンドサーバーは、主に資産の管理とルーティングに使用されます。nodejsと一緒にバックエンドで実行することが決定されましたexpressjs。ブラウザから適切なサイトに送信されるすべてのクロスドメインajaxAPI呼び出しを(プロキシとして)ルーティングし、jsonデータをブラウザにルーティングするために、expressjsルーティングでどのような変更を行う必要があるか知りたいですか?

4

1 に答える 1

3

呼び出しを API にルーティングする小さなプロキシを作成しましたが、最終的には削除したため、もう少し作業が必要になる場合があります。基本的な考え方は次のとおりです。

  • Ajax はすべてのブラウザーでクロスドメイン リクエストを作成できない
  • に外部 API があります。http://api.example.com/
  • あなたのアプリケーションはhttp://foo.com/
  • に行くすべてをプロキシしhttp://foo.com/api/*たいhttp://api.example.com/*

これを行う最善の方法は、Streamsを使用することです。へのすべてのリクエストをフィルタリングしてから、受信した URL に基づいてfoo.com/api/へリクエストを送信します。api.example.comすると、次の 4 つのオブジェクトができます。

  • へのリクエストはfoo.com
  • そのリクエストのレスポンス オブジェクト
  • へのリクエストはapi.example.com
  • API サーバーからの応答

それらはすべてストリームです。最初と最後は読み取り可能なストリームで、その他は書き込み可能なストリームです。したがって、あなたがしたいことは、読み取り可能なストリームから書き込み可能なストリームに来るものは何でも書き込むことです。読み取り可能なストリームのpipeメソッドでそれを行います。これは次のようになります。

requestFromBrowser.pipe(requestToAPI(function (responseFromAPI) {
  responseFromAPI.pipe(responseToBrowser);
}));

ヘッダーを手動で記述し、その他の詳細を処理する必要があります。これは私の基本的なコードがどのように見えるかです。Connect/Express のミドルウェアです。

var http = require('http');

exports.proxy = function (prefix) {
  return function (req, res, next) {
    var options = {
      port: 3000,
      // the server receives a url like http://foo.com/api/(*)
      // send the proxy only (*)
      path: req.url.substr(prefix.length),
      // headers and the method need to be written explicitely
      method: req.method,
      headers: req.headers
    };
    if (req.url.indexOf(prefix) === 0) {
      req.pipe(http.request(options, function (proxy) {
        res.writeHead(proxy.statusCode, proxy.headers);
        proxy.pipe(res);
      }).on('error', next));
    } else {
      next();
    }
  };
};

すでにこれを行っているモジュールを探すことをお勧めします。おそらく、NPM レジストリーに複数存在します。また、ストリームはプロキシなどを書くのに最適なので、ストリームの詳細を読んでください。


于 2013-01-16T14:36:12.653 に答える