如何在中间件中使用这个上下文
我为自己的目的编写了自己的中间件,如下所示:
-- 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好的文章,更好地理解这种行为。