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有关吗? - 我这样做错了吗?
答案 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
的引用作为回调传递给您希望某些代码存储然后再调用时,这是一个常见问题。您必须将对象“绑定”到它,以便使用正确的对象上下文调用它。