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

2024-01-11

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

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


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

有几种技术可以绑定上下文,你可以使用 apply、call、闭包或者更简单的 newES6 箭头函数 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions。 这是一个使用闭包的示例:
[edit]修复示例中的拼写错误,并添加功能代码示例。

中间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');

谷歌搜索“javascript函数绑定上下文”你可以找到好的文章并更好地理解这种行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在中间件中使用“this”上下文 的相关文章

随机推荐