Node.js Express中间件中调用原型函数时this指向异常问题
解决Express中间件中this绑定失效的问题
这问题我之前踩过坑!核心原因是this的上下文绑定在Express中间件环境里发生了变化,咱们先理清楚问题出在哪:
你单独运行call_test.js时,test_ob.b()是通过实例直接调用的,这时候b方法里的this会自动指向test_ob实例,所以this.c()能正常执行;但在Express中间件里,大概率你是把b方法直接当作回调函数传递了(比如app.get('/xxx', test_ob.b)),这时候Express会把b作为普通函数执行,this就不再指向你的test_ob实例了,而是指向Express的请求上下文(比如req或者res对象),自然就找不到c方法了。
下面给你几个靠谱的解决方案:
方案1:用箭头函数包裹调用(最简单直接)
在中间件里不要直接传test_ob.b,而是用箭头函数把调用包裹起来,箭头函数会保留外层的上下文,确保b方法里的this指向实例:
const express = require('express'); const app = express(); const test = require('./test'); const test_ob = new test(); app.get('/', (req, res) => { test_ob.b(); // 这里this会正确指向test_ob res.send('Done'); }); app.listen(3000);
方案2:提前给方法绑定this
如果一定要把b方法直接作为中间件回调,可以在创建实例后,用bind把b方法的this固定到实例上:
const test_ob = new test(); // 绑定this到test_ob实例 test_ob.b = test_ob.b.bind(test_ob); // 现在可以直接传方法作为回调了 app.get('/', test_ob.b);
方案3:改用ES6 Class语法(更推荐,可读性更强)
把你的test.js改成ES6类的写法,类方法里的this默认会指向实例,能从根源减少this绑定的问题:
// test.js class A { b() { this.c("asdsad"); } c(string) { console.log("ccc" + string); } } module.exports = A;
调用端的代码不用改,Express里使用时同样可以用上面两种方法确保this正确绑定,Class写法的代码结构更清晰,后期维护也方便。
内容的提问来源于stack exchange,提问作者user3110655
相关产品推荐
相关产品推荐

