如何在中间件中使用“this”上下文

时间:2013-08-29 08:04:36

标签: node.js express connect middleware

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

-- 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对象。怎么能正确使用呢?

2 个答案:

答案 0 :(得分:8)

这不是因为中间件 总是当一个函数作为javascript中的参数传递时,它正在丢失上下文。 Express将中间件作为参数传递。所以这就是为什么。

有几种绑定上下文的技术,您可以使用apply,call,a closure或更简单的新ES6 arrow functions。 这是一个使用闭包的例子:
[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();
            });
        }
     }
};

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 :(得分:1)

你不能,'this'属性永远是vanilla Server(http.Server)实例或兼容的处理程序。

你可以这样做:

var middlewares = {};

module.exports = middlewares;

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

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