Eri*_*rik 4 middleware connect node.js express
我为自己的目的编写了自己的中间件作为模块,如下所示:
-- 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();
});
}
};
Run Code Online (Sandbox Code Playgroud)
在我的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);
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不起作用,因为fn2中的这个上下文不是myMiddleware.js对象.怎么能正确使用这个?
这不是因为中间件.
总是当一个函数作为javascript中的参数传递时,它正在丢失上下文.Express将中间件作为参数传递.所以这就是为什么.
有几种绑定上下文的技术,您可以使用apply,call,a closure或更简单的新ES6箭头函数.这是一个使用闭包的示例:
[edit]修复示例中的拼写错误,并添加功能代码示例.
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();
});
}
}
};
Run Code Online (Sandbox Code Playgroud)
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');
Run Code Online (Sandbox Code Playgroud)
谷歌搜索"javascritp函数绑定上下文",你可以找到好的文章,并更好地了解这种行为.