4

次のような目的のために、独自のミドルウェアをモジュールとして作成しました。

-- myMiddleware.js

module.exports = {
    fn1: function (req, res, next) {
       console.log('fn1');
       next();
    },

    fn2: function (req, res, next) {
        console.log('fn2');
        this.fn1(req, res, function () {
             next();
        });
    }
};

私の sserver.js では、このミドルウェアを次のように使用します。

app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser('your secret here'));

app.use(require('./myMiddleware').fn2);

残念ながら、このコンテキストは fn2 の myMiddleware.js オブジェクトではないため、機能しません。これを適切に使用するにはどうすればよいですか?

4

2 に答える 2

8

これはミドルウェアのせいではありません。
JavaScriptで関数が引数として渡されると、常にコンテキストが失われます。Express はミドルウェアを引数として渡します。だから。

コンテキストをバインドするにはいくつかの手法があります。適用、呼び出し、クロージャー、またはより簡単な新しいES6 アロー関数を使用できます。これはクロージャを使用した例です:
[編集]あなたの例からのタイプミスを修正し、機能コードの例を追加します。

middle.js

module.exports = {
    fn1: function(req, res, next) {
       console.log('fn1');
       next();
    },

    fn2: function(req, res, next) {
        var self = this;
        return function (req, res, next) {
            console.log('fn2');
            self.fn1(req, res, function () {
                next();
            });
        }
     }
};

server.js ( fn2() に注意してください)

var express = require('express');
var app = express();
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser('your secret here'));

app.use(require('./middle.js').fn2());
app.get('/', function(req, res) {
    res.send('hey!');
});
app.listen('3000');

「javascritp function bind context」をグーグルで検索すると、良い記事が見つかり、この動作をよりよく理解できます。

于 2013-08-29T12:10:14.857 に答える
1

'this' プロパティは常にバニラ サーバー (http.Server) インスタンスまたは互換ハンドラーになります。

あなたはこれを行うことができます:

var middlewares = {};

module.exports = middlewares;

middlewares.fn1 = function(req, res, next){ ... };

middlewares.fn2 = function(req, res, next){ 
    middlewares.fn1(req, res, next); 
};
于 2013-08-29T08:17:10.010 に答える