如何在中间件中使用这个上下文

我为自己的目的编写了自己的中间件,如下所示:

-- 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对象。 如何使用适当的这个?

你不能,'这个'属性将永远是香草服务器(http.Server)实例或兼容处理程序。

你可以这样做:

 var middlewares = {}; module.exports = middlewares; middlewares.fn1 = function(req, res, next){ ... }; middlewares.fn2 = function(req, res, next){ middlewares.fn1(req, res, next); }; 

这不是因为中间件。
总是当一个函数作为parameter passing给JavaScript时,它将丢失上下文。 Express作为parameter passing中间件。 所以这就是为什么。

有几种技术来绑定上下文,你可以使用apply,call,closure或者更简单的新的ES6箭头函数 。 这是一个使用闭包的例子:
修改您的示例中的拼写错误,并添加function性代码示例。

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'); 

谷歌search“javascritp函数绑定上下文”,你可以find好的文章,更好地理解这种行为。