43

express.jsで、各URIリスナーのリクエストオブジェクトに追加の属性を提供したいと思います。これにより、プロトコル、ホスト名、およびポート番号が提供されます。例えば:

app.get('/users/:id', function(req, res) {
  console.log(req.root); // https://12.34.56.78:1324/
});

もちろん、req.protocol、req.hostを連結し、URIリスナーのそれぞれのポート番号(reqオブジェクトから欠落しているようです)をなんとかして渡すこともできますが、それを実行できるようにしたいと思います。それらすべてがこの情報にアクセスできる方法。

また、ホスト名はリクエストごとに異なる可能性があるため(マシンには複数のインターフェイスがあります)、アプリケーションの起動時にこの文字列を連結することはできません。

目標は、このAPIのさらなるリソースを指すURIをコンシューマーに提供することです。

reqオブジェクトにこの追加情報を持たせたいことをExpressに伝える何らかの方法はありますか?私が概説していることよりもこれを行うためのより良い方法はありますか?

4

5 に答える 5

74

各リクエストのプロパティを設定するカスタムミドルウェアを追加できます。

app.use(function (req, res, next) {
    req.root = req.protocol + '://' + req.get('host') + '/';
    next();
});

req.getヘッダーを取得するために使用しHostます。ヘッダーには、必要に応じてポートを含める必要があります。

必ず前に追加してください:

app.use(app.router);
于 2012-09-20T18:13:49.417 に答える
36

express.requestプロトタイプを拡張できます。

于 2012-09-23T23:11:18.200 に答える
8

リクエストオブジェクトを変更する最良の方法は、app.router宣言の前に独自のミドルウェア関数を追加することです。

    app.use(function(req, res, next){
      // Edit request object here
      req.root = 'Whatever I want';
      next();
    });
    app.use(app.router);

これにより、リクエストオブジェクトが変更され、すべてのルートがreq.rootプロパティにアクセスできるようになります。

    app.get('/',function(req, res, next){
      console.log(req.root); // will print "Whatever I want";
    });
于 2012-09-20T18:12:50.267 に答える
4

ミドルウェアを使用できます。app.configureこれをブロックに追加します。

app.use(function (req, res, next) {
  req.root = 'WHAT YOU WANT';
  next();
});

すべてのリクエストはこの機能を困難にし、その後、のおかげで正しいURLブロックに移動しnext()ます。

于 2012-09-20T18:13:12.507 に答える
1

応答オブジェクトは、のカスタム変数をサポートしますres.localshttp://expressjs.com/en/4x/api.html#res.localsを参照してください

これは、typescriptユーザーにとって特に便利です。localsプロパティが入力されますRecord<string, any>

于 2020-10-19T09:38:37.420 に答える