[解決済み] express.jsでプロキシ
2022-04-21 13:22:47
質問
同一ドメインでのAJAXの問題を避けるために、node.jsのウェブサーバーで、URL
/api/BLABLA
を別のサーバーに転送します。
other_domain.com:3000/BLABLA
そして、このリモート・サーバーが返したものと同じものを、透過的にユーザーに返します。
他のすべてのURLは
/api/*
は、プロキシングを行わず、直接提供されます。
node.js + express.js で実現するにはどうしたらいいですか?簡単なコード例を教えてください。
(ウェブサーバとリモートの
3000
サーバは私の管理下にあり、両方ともnode.jsとexpress.jsが動作しています)
今のところ、次のようなものが見つかりました。 https://github.com/http-party/node-http-proxy しかし、そこにあるドキュメントを読んでも、私には何の賢さもありませんでした。結局
var proxy = new httpProxy.RoutingProxy();
app.all("/api/*", function(req, res) {
console.log("old request url " + req.url)
req.url = '/' + req.url.split('/').slice(2).join('/'); // remove the '/api' part
console.log("new request url " + req.url)
proxy.proxyRequest(req, res, {
host: "other_domain.com",
port: 3000
});
});
が、元のウェブサーバー(あるいはエンドユーザー)には何も返ってこないので、お手上げです。
解決するには?
を使用したい。
http.request
を使用して、リモートAPIへの同様のリクエストを作成し、そのレスポンスを返します。
このようなものです。
const http = require('http');
// or use import http from 'http';
/* your app config here */
app.post('/api/BLABLA', (oreq, ores) => {
const options = {
// host to forward to
host: 'www.google.com',
// port to forward to
port: 80,
// path to forward to
path: '/api/BLABLA',
// request method
method: 'POST',
// headers to send
headers: oreq.headers,
};
const creq = http
.request(options, pres => {
// set encoding
pres.setEncoding('utf8');
// set http status code based on proxied response
ores.writeHead(pres.statusCode);
// wait for data
pres.on('data', chunk => {
ores.write(chunk);
});
pres.on('close', () => {
// closed, let's end client request as well
ores.end();
});
pres.on('end', () => {
// finished, let's finish client request as well
ores.end();
});
})
.on('error', e => {
// we got an error
console.log(e.message);
try {
// attempt to set error message and http status
ores.writeHead(500);
ores.write(e.message);
} catch (e) {
// ignore
}
ores.end();
});
creq.end();
});
お知らせです。上記は実際に試したわけではないので、パースエラーが含まれるかもしれませんが、これが動作させるためのヒントになることを期待しています。
関連
-
[解決済み】Express.js req.bodyが未定義です。
-
[解決済み】Heroku + node.jsのエラー(Webプロセスが起動後60秒以内に$PORTにバインドできなかった)。
-
[解決済み] Npmエラー - Windows NT - 解決方法
-
[解決済み] Macでポート3000をロックしているプロセスを見つける(そして殺す)【終了
-
[解決済み] forEachループでasync/awaitを使用する
-
[解決済み] Node.js上のExpress.jsでGET(クエリ文字列)変数を取得する方法とは?
-
[解決済み] プロキシサーバーで Git を動かす - "Request timed out" で失敗する
-
[解決済み] Express.js - app.listen vs server.listen
-
[解決済み] express.js で HTTPS を有効にする
-
[解決済み] Express.jsとは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】MongoClient v3.0使用時、db.collectionは関数ではない
-
[解決済み】モジュール '@babel/core' が見つかりません。
-
[解決済み】MongooseでEnumを作成し使用する方法
-
webpack ENOENTソリューションの起動
-
[解決済み】POSTできない/expressを使用するとエラーが発生する
-
[解決済み】npm 5で作成されたpackage-lock.jsonファイルはコミットするのでしょうか?
-
[解決済み] joiライブラリを使用して2つの時間を比較する方法
-
[解決済み] S3 Bucket に何かを送信しようとすると、AWS Missing credentials が表示される (Node.js)
-
[解決済み] ノードマータ予期せぬフィールド
-
[解決済み] バルク更新を行う。