【问题标题】:Node.js ES6 Class unable to call class method from within class method when using Express.js使用 Express.js 时,Node.js ES6 类无法从类方法中调用类方法
【发布时间】:2018-05-17 21:29:00
【问题描述】:

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(),并且没有t 解决我如何从同一个类中调用另一个方法的问题,例如 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 有关吗? - 我做错了吗?

【问题讨论】:

  • 您应该将 verifyUserIdentity 更改为静态方法并像这样调用它:this.constructor.verifyUserIdentity()
  • @TaylorAckley 我也试过了。它没有用。结果和以前一样。它执行 update() 方法中的代码并在调用 verifyUserIdentity() 时停止

标签: node.js express es6-class


【解决方案1】:

您的方法中没有正确的 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 的引用作为回调传递时,这是一个普遍的问题,您希望一些代码存储然后稍后调用。您必须将对象“绑定”到它,以便使用正确的对象上下文调用它。

【讨论】:

  • 正确!像魅力一样工作就像附注@TaylorAckley一样,您还需要将其设为静态方法的建议。
猜你喜欢
  • 2021-02-03
  • 1970-01-01
  • 2019-06-16
相关资源
最近更新 更多