2

だから私はこれがうまくいくことを知っています:

app.use(express.vhost('sub.xyz.com', subdomainApp));
app.use(express.vhost('xyz.com', mainApp));

しかし、express.vhost でホスト部分を動的に設定しようとすると、単に機能しません。(本番環境と開発環境の間を移動するときにハードコードされたドメインを変更しないように、動的に設定する必要があります。)

以下のコードを試してみましたが、なぜこれが機能しないのかわかりません:

app.use(function(req, res){ return express.vhost('xyz.'+req.host, subdomainApp); });
app.use(function(req, res){ return express.vhost(req.host, mainApp); });

それでは、「リクエストホスト」を動的にexpress.vhostに渡すにはどうすればよいですか?

4

3 に答える 3

2

実装の詳細は正確にはわかりませんが、私が提案し、最も一般的な方法だと思うのは、これらの構成パラメーターを環境変数に設定することです。

あなたが持っているでしょう。
app.use(express.vhost('xyz' + process.env.APP_HOST, subdomainApp));

そのため、本番/開発環境で異なる環境変数を使用できます。

コマンドラインから環境変数を設定するには

export APP_HOST=wahtever  

またはノードコマンドを実行する直前に追加

APP_HOST=whatever node server.js

または、それらを *.bash_profile* または OS の同等のものに追加します

于 2013-10-22T10:51:44.020 に答える
2

私はあなたの質問を読み違えたので、私の答えはプログラムで仮想ホストをバインドすることについてです。リクエストが入ったときにその場で新しい vhost をバインドできるかどうかはわかりませんが、それは悪い考えのように思えます。@alfonsodev の手法を使用して、いずれかの環境を強制します。

一連の既知のサブドメインと、それらのドメインに対して実行したい特定のミドルウェアがある場合、次のようにそれらすべてをバインドできます。

$ # set env variable before invoking the script
$ APP_DEVPROD=dev node server.js

// Default to 'prod' if no env var set
var p = process.env.APP_DEVPROD || 'prod';
var myHost = (p === 'dev' ? 'localhost:8001' : 'xyz.com');

[
  ['admin.'+myHost, handlers.admin],
  ['demo.'+myHost, handlers.demo],
].forEach(setVhost);

function setVhost(pair){
  var hostname = pair[0];
  var appFn = pair[1];
  app.use(express.vhost(hostname, appFn));
}
于 2013-10-22T14:53:05.407 に答える