gpt4 book ai didi

node.js - 如何在中间件中使用 'this'上下文

转载 作者:搜寻专家 更新时间:2023-10-31 22:59:43 26 4
gpt4 key购买 nike

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

-- 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 中的 this 上下文不是 myMiddleware.js 对象。如何正确使用这个?

最佳答案

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

有几种技术可以绑定(bind)上下文,您可以使用 apply、call、闭包或更简单的 new ES6 arrow functions .这是一个使用闭包的例子:
[edit] 修复示例中的拼写错误,并添加功能代码示例。

中间件

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

关于node.js - 如何在中间件中使用 'this'上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18505383/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com