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

时间:2018-05-17 21:29:00

标签: node.js express es6-class

Nb。这让我有点疯狂,我几次在房子里走来走去。然而,我对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的节点中运行此代码,那么:

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有关吗?   - 我这样做错了吗?

1 个答案:

答案 0 :(得分:3)

您的方法中没有得到正确的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将在该方法内undefined(在严格模式下)而不是user对象。您可以使用.bind()解决此问题,如上所示。

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