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

Node.js ES6类在使用Express.js时无法从类内方法调用类方法,node.js,express,es6-class,Node.js,Express,Es6 Class,注意。这让我有点发疯,我已经在房子周围转了好几圈。然而,我对ES6和JS整体来说是相当陌生的,我完全理解JS类与其他语言中的类不同,可能是完全错误的 我正在运行以下代码,该代码在节点v8.9.0上使用Express.js v4.16.3和body parser v1.18.2 app.post('/api/v1/user/update', urlencodedParser, user.update); 代码调用“urlencodedParser”,它作为中间件提供带有“req.body”的“r

注意。这让我有点发疯,我已经在房子周围转了好几圈。然而,我对ES6和JS整体来说是相当陌生的,我完全理解JS类与其他语言中的类不同,可能是完全错误的

我正在运行以下代码,该代码在节点v8.9.0上使用Express.js v4.16.3和body parser v1.18.2

app.post('/api/v1/user/update', urlencodedParser, user.update);
代码调用“urlencodedParser”,它作为中间件提供带有“req.body”的“req”,以便我可以提取表单字段“用户”是一个已导出的类模块,包含用于验证、更新等的所有函数,如下所示:

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

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

module.exports = new Users;
现在,如果我在没有Express的节点中运行此代码,如下所示:

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

users.update();
这一切似乎都在执行,我在CLI上获得以下输出:

updating...
verify
updating...
如果我在上面的app.post中将其全部打包,并使用Postman发送帖子,它将执行第一个方法,并在console.log之后停止,没有错误。它似乎没有调用verifyUserIdentity,我在CLI上得到以下信息:

updating...
verify
updating...
如果我像下面看到的那样修改代码,并传递一组方法来表示“中间件处理程序”,它似乎可以工作,但现在我必须单独调用verifyUserIdentity,并且不能解决如何从同一类调用另一个方法的问题,例如log方法

我的问题是: -为什么原始模式不能与Express一起使用? -“这”是否因为回调处理程序而提高了? -这与节点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方法的引用,与用户对象的关联将丢失。当Express将其作为普通函数调用时,它将在该方法中的严格模式下未定义,而不是在用户对象中。您可以使用.bind解决上述问题


仅供参考,这与Express无关。当将对obj.method的引用作为回调传递时,这是一个一般性问题,您需要存储一些代码,然后在以后调用。您必须将对象绑定到它,以便使用正确的对象上下文调用它。

您的方法中没有得到正确的this指针

更改此代码行:

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

app.post('/api/v1/user/update', urlencodedParser, user.update.bind(user));
当您传递user.update时,它传递的只是对update方法的引用,与用户对象的关联将丢失。当Express将其作为普通函数调用时,它将在该方法中的严格模式下未定义,而不是在用户对象中。您可以使用.bind解决上述问题


仅供参考,这与Express无关。当将对obj.method的引用作为回调传递时,这是一个一般性问题,您需要存储一些代码,然后在以后调用。您必须将对象绑定到它,以便使用正确的对象上下文调用它。

您应该将verifyUserIdentity更改为静态方法,并像这样调用它:this.constructor。verifyUserIdentity@TaylorAckley我也试过了。它不起作用。结果和以前一样。它执行update方法中的代码,并在调用verifyUserIdentity时停止。您应该将verifyUserIdentity更改为静态方法,并像这样调用它:this.constructor。verifyUserIdentity@TaylorAckley我也试过了。它不起作用。结果和以前一样。它执行update方法中的代码,并在调用verifyUserIdentityRight on!时停止!就像一个配音@TaylorAckley一样,你的建议也需要把它变成一个静态方法。没错!就像一个配音@TaylorAckley一样,你建议将其作为一个静态方法也需要。