【问题标题】:How to use 'this' context in middleware如何在中间件中使用“this”上下文
【发布时间】:2013-09-01 13:24:21
【问题描述】:

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

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

【问题讨论】:

    标签: node.js express connect middleware


    【解决方案1】:

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

    有几种技术可以绑定上下文,您可以使用应用、调用、闭包或更简单的新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 函数绑定上下文”,您可以找到好文章并更好地理解这种行为。

    【讨论】:

    • 这是这个问题的正确答案。 OP 接受的答案无法解释
    【解决方案2】:

    你不能,'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); 
    };
    

    【讨论】:

    • 为什么我不能只使用 var middlewares = module.exports = {}; ?
    • 你可以!,你也可以跳过中间件参考并使用exports.fn1 = ...;出口.fn2 = 函数(...){出口.fn1();};这取决于您感觉如何更舒适。
    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 2021-12-18
    • 1970-01-01
    相关资源
    最近更新 更多