Express post路由回调中this调用类方法报未定义的解决方案
问题原因
普通function定义的路由回调被Express触发执行时,函数内部的this会被Express重写为请求相关的上下文对象,不再指向当前类的实例,自然无法找到类上定义的second方法,最终抛出this为undefined的错误。
你对.bind()的用法存在误解:绑定上下文不会阻断参数传递,完全可以在这个场景下使用。
可行解决方案
方案1:使用箭头函数定义路由回调
箭头函数没有自身的this绑定,会直接继承定义位置外层作用域的this(也就是first方法执行时对应的类实例),是最简洁的写法:
// 替换原代码中的app.post部分即可 app.post('/centroid', (req, res) => { this.second(req.body); // 记得补充响应逻辑,否则请求会挂起超时 res.json({ received: true }); });
方案2:正确使用.bind()绑定上下文
不需要在回调函数内部做绑定,只需要在注册路由时,给回调函数提前绑定当前类实例的this即可。bind只会固定函数执行时的上下文,Express传入的req、res等参数会正常透传到回调中,完全不影响req.body的获取和传递:
app.post('/centroid', function(req, res) { this.second(req.body); res.json({ received: true }); }.bind(this)); // 函数定义后直接绑定当前类实例上下文
方案3:提前缓存类实例引用
在first方法开头先把当前实例的引用存到局部变量里,回调中直接使用这个缓存的引用调用方法,不会受上下文变化的影响,是兼容性最好的经典写法:
first() { var app = express(); var path = require('path'); const instance = this; // 提前缓存当前类实例的引用 app.use( express.urlencoded({ extended: true }) ) app.use( express.json() ); app.post('/centroid', function(req, res) { instance.second(req.body); // 用缓存的引用调用方法,不会丢失上下文 res.json({ received: true }); }); app.listen(4444); }
注意:原代码的路由回调中只调用了日志方法,没有给客户端返回任何响应,实际运行时请求会一直挂起直到超时,使用时需要根据业务需求补充
res.send/res.json等响应逻辑。
内容的提问来源于stack exchange,提问作者Sanlyn
相关产品推荐
相关产品推荐

