6

app.getの動作を拡張しようとしていますが、それを行った後、アプリは拡張前に行った構成の一部を失っているようです。

次のスニペットでは、/sampleおよび/es/sampleの出力はであり、予想される出力は「値」である必要があります。

私は何か間違ったことをしていますか?

var app = require('express')();

app.set('myprop', 'value');

var _get = app['get'];

app['get'] = function (route, middleware, callback) {
    _get.call(app, route, middleware, callback);

    // For instance: I generate a new route for 'es' language.
    _get.call(app, '/es' + route, middleware, callback);
};

app.get('/sample', function(req, res){
    res.send(app.get('myprop'));
});

app.use(app.router);
app.listen(3000);

アップデート

すみません、自分で答えます…

拡張メソッドの次の最初の行を見逃しました:)

if (middleware === undefined && callback === undefined) return _get.call(app, route);

今では魅力のように機能します!

app['get'] = function (route, middleware, callback) {
    if (middleware === undefined && callback === undefined) return _get.call(app, route);
    _get.call(app, route, middleware, callback);

    // For instance: I generate a new route for 'es' language.
    _get.call(app, '/es' + route, middleware, callback);
};
4

1 に答える 1

1

あなたのコードではapp.get、1つの引数で動作が壊れています。これを試して:

var app = require('express')();

app.set('myprop', 'value');

var _get = app['get'];

app['get'] = function (route, middleware, callback) {
    if (arguments.length > 1) {
        _get.call(app, route, middleware, callback);

        // For instance: I generate a new route for 'es' language.
        _get.call(app, '/es' + route, middleware, callback);
    } else {
        return _get.apply(app, arguments);
    }
};

app.get('/sample', function(req, res){
    res.send(app.get('myprop'));
});

app.use(app.router);
app.listen(3000);
于 2012-11-03T16:50:52.743 に答える