3

app.router の後に呼び出されるミドルウェアを作成しています。ルート ミドルウェアとルート ハンドラによって res.locals オブジェクトに格納されたデータにアクセスする必要があります。

//...
app.use(app.router);
app.use(myMiddleware);
//...

app.get('/', function(req, res) {
    res.locals.data = 'some data';
});

function myMiddleware(req, res, next) {
    if (res.locals.data)
        console.log('there is data');
    else
        console.log('data is removed'); // that's what happens
}

問題は、res.locals のすべてのプロパティが app.router の後で空になることです。

Express または Connect が res.locals をクリーンアップしてパッチを適用する場所を見つけようとしましたが、今のところ見つかりません。

現時点で私が目にする唯一の解決策は、このロジックを別のミドルウェアに配置するという考えを放棄し、res.locals が利用可能なルート固有のミドルウェアに配置することですが、これによりシステムがより相互接続されます。また、(res.redirect が呼び出されたときに) ルート ミドルウェアが次に呼び出さないルートがたくさんあるので、それを機能させるために多くの変更を行う必要があります。私はそれを避けて、このロジックを別のミドルウェアに入れたいと思っていますが、res.locals に保存されたデータにアクセスする必要があります。

どんな助けでも本当に感謝しています。

4

1 に答える 1

5

前にバインドすることもできますが、後で実行するようにします。loggerミドルウェアはその一例です。

app.use(express.logger('tiny'));
app.use(myMiddleware);
app.use(app.router);

function myMiddleware(req, res, next) {
    var end = res.end;
    res.end = function (chunk, encoding) {
        res.end = end;
        res.end(chunk, encoding);

        if (res.locals.data)
            console.log('there is data');
        else
            console.log('data is removed');
    };

    next();
}

app.get('/', function (req, res) {
    res.locals.data = 'some data';
    res.send('foo'); // calls `res.end()`
});

リクエスト/の結果:

GET / 200 3 - 6 ms
there is data
GET /favicon.ico 404 - - 1 ms
data is removed
于 2013-04-03T16:32:11.247 に答える