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