1

これは私のExpress構成コードです:

var server = express()
    .use(express.cookieParser())
    .use(express.session({secret: buffer.toString('hex')}))
    .use(express.bodyParser())
    .use(express.static('./../'));

server.use(server.router);

.use最後のものが残りのように連鎖されていないのは非常に迷惑です。

Expressミドルウェア定義を完全に連鎖させるにはどうすればよいですか?

4

1 に答える 1

6

エクスプレス使用の実装thisは毎回返されるため、常に連鎖可能です。連鎖性の問題は、の不要な使用に起因します。server.use(server.router)これは、最初の非ミドルウェアルートが、などを介して追加されたときにエクスプレスによって自動的に実行されますserver.getserver.postこれは、ここのエクスプレスソースコードで確認できますが、これは一般的なポイントです。混乱と問題の問題(ほとんどのserver.user(server.router)場合、ルーターをデフォルトの場所に移動させるのではなく、ルーターを実行することで発生します。これは、ほとんどの場合、ルーターにとって正しい場所です。フォーラムは次のとおりです。

  1. server.useミドルウェアをセットアップするための適切に順序付けられた呼び出し
  2. server.get('/home')およびその他のHTTPメソッド関数を使用した特定のルート
  3. エラー処理、404ミドルウェアなど

Expressは1の後、2の前にルーターを追加し、すべてがうまくいくでしょう。

行を省略した場合に主張するコメントではserver.router、にアクセスできなくなりますreq.session。申し訳ありませんが、そうではありません。これは、セッションミドルウェアがreq.session未定義になる直前のミドルウェアと、セッションミドルウェアが存在する直後のミドルウェアを表示する、動作中のExpressアプリ全体です。

    var express = require('express');
    var server = express();
    server.use(function (q,r,n) {console.log('Before cookie:', q.session);n();});
    server.use(express.cookieParser());
    server.use(function (q,r,n) {console.log('after cookie:', q.session);n();});
    server.use(express.session({secret: 'SEKRET'}));
    server.use(function (q,r,n) {console.log('after session:', q.session);n();});
    server.get('/', function (q,r,n) {r.send("you got slashed");});
    server.listen(3000);

それを実行すると、コンソールにこれが表示されます。

Before cookie: undefined
after cookie: undefined
after session: { cookie: 
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true } }

ただし、変数が定義されているのと同じステートメントで変数を関数パラメーターとして使用できない理由を尋ねる場合、serverそれがJavaScriptの動作方法であり、expressとは関係ありません。あなたはこれを行うことはできません:

var foo = console.log(foo.bar);

fooステートメント全体が完了するまでは未定義だからです。

FWIW私の意見では、このような連鎖可能なコードは疑わしいと思います。デバッガーやブレークポイントには不向きであり、ファーストクラスの言語機能としてサポートされておらず、各行がインデントされていない場合と比較して、実際には文字を節約できませんapp.use(app.router)

于 2013-01-19T14:49:34.727 に答える