gpt4 book ai didi

使用 Express.js 时,Node.js ES6 类无法从类方法内调用类方法

转载 作者:太空宇宙 更新时间:2023-11-03 23:00:07 25 4
gpt4 key购买 nike

注意。这让我有点抓狂,我已经在房子里转了好几次了。然而,我对 ES6 和 JS 整体来说相当陌生,并且完全理解 JS 类与其他语言中的类不同,并且可能会完全错误地处理这个问题。

我正在 Node v8.9.0 上运行以下代码,该代码使用 Express.js (v4.16.3) 和 body-parser (v1.18.2)。

app.post('/api/v1/user/update', urlencodedParser, user.update);

代码调用“urlencodedParser”,它充当中间件来提供“req”和“req.body”,以便我可以提取表单字段。 “user”是一个已导出的类模块,包含用于验证、更新等的所有功能,看起来像这样:

class Users {    
update(req,res) {
console.log('updating...');
this.verifyUserIdentity();
}

verifyUserIdentity(req,res) {
console.log('verify');
}
}

module.exports = new Users;

现在,如果我要在没有 Express 的 Node 中运行此代码,如下所示:

var users = require('./modules/users');

users.update();

一切似乎都已执行,我在 CLI 上得到以下输出:

updating...
verify

如果我将其全部包装在 app.post() (上面)中并使用 Postman 发送 POST,它会执行第一个方法并在 console.log( )没有错误。似乎没有调用verifyUserIdentity(),我在 CLI 上得到以下信息:

updating...

如果我修改代码,如下所示,并将一组方法传递给 Express 的中间件处理程序,它似乎可以工作,但现在我必须单独调用 verifyUserIdentity(),并且不会'无法解决如何调用同一类中的另一个方法的问题,例如 log() 方法。

class Users {    
update(req,res) {
console.log('updating...');
}

verifyUserIdentity(req,res,next) {
console.log('verify');
next();
}
}

module.exports = Users;



app.post('/api/v1/user/update', [urlencodedParser, users.verifyUserIdentity], users.update);

我的一些问题: - 为什么原始模式不能与 Express 配合使用? - 由于回调处理程序,“this”是否增加了? - 这与 Node v8.9.0 有关系吗? - 我做的这一切都错了吗?

最佳答案

您在方法中没有获得正确的 this 指针。

更改这行代码:

app.post('/api/v1/user/update', urlencodedParser, user.update);

对此:

app.post('/api/v1/user/update', urlencodedParser, user.update.bind(user));

当您传递user.update时,它传递的只是对update()方法的引用,并且与user对象的关联将丢失。然后,当 Express 将其作为普通函数调用时,this 将在该方法内为 未定义(在严格模式下),而不是您的 user 对象。您可以使用 .bind() 来解决这个问题,如上所示。

仅供引用,这与 Express 没有任何具体关系。当您希望存储一些代码并稍后调用时,将对 obj.method 的引用作为回调传递时,这是一个常见问题。您必须将对象“绑定(bind)”到它,以便使用正确的对象上下文调用它。

关于使用 Express.js 时,Node.js ES6 类无法从类方法内调用类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50400776/

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