1. ホーム
  2. node.js

[解決済み] 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();
});

お知らせです。上記は実際に試したわけではないので、パースエラーが含まれるかもしれませんが、これが動作させるためのヒントになることを期待しています。