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 对象。如何正确使用这个?

4

2 回答 2

8

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

有几种技术可以绑定上下文,您可以使用应用、调用、闭包或更简单的新ES6 箭头函数。这是一个使用闭包的示例:
[编辑]修复示例中的拼写错误,并添加功能代码示例。

中间.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 函数绑定上下文”,您可以找到好文章并更好地理解这种行为。

于 2013-08-29T12:10:14.857 回答
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); 
};
于 2013-08-29T08:17:10.010 回答