2013-08-29 2 views
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. Как можно правильно использовать это?

ответ

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); 
}; 
+0

Спасибо за помощь – Erik

+0

Почему я не могу использовать только var middlewares = module.exports = {}; ? – Erik

+0

вы можете !, вы также можете пропустить ссылку middlewares и использовать export.fn1 = ...; export.fn2 = function (...) {exports.fn1();}; это зависит от того, как вы чувствуете себя более комфортно. –

8

Это не потому, что промежуточное программное.
Всегда, когда функция передается в качестве аргументов в javascript, она теряет контекст. Экспресс пропускает middlewares вокруг как аргументы. Вот почему.

Существует несколько способов привязки контекста. Вы можете использовать заявку, вызов, закрытие или более легкий новый ES6 arrow functions. Это пример использования:
Редактирование опечаток из вашего примера и добавление примера функционального кода.

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(); 
      }); 
     } 
    } 
}; 

sever.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 контекста привязки" вы можете найти хорошие статьи и лучше понять это поведение.

+1

Это правильный ответ на этот вопрос. Ответ, принятый OP, не объясняет –

Смежные вопросы