Node.js ES6 Class 使用 Express.js 时无法从 class 方法中调用 class 方法
Node.js ES6 Class unable to call class method from within class method when using Express.js
Nb. 这让我有点抓狂,我已经在这些房子周围转过几次了。然而,我对 ES6 和 JS 作为一个整体还是相当陌生,并且完全理解 JS Class 与其他语言中的 Classes 不同,并且可能完全错误地处理这个问题。
我正在 运行ning 以下代码,它在 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 模块,包含用于验证、更新等的所有功能,看起来像这样:
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()分开,并没有解决我如何从同一个 class 调用另一个方法的问题,例如 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
将是该方法内的 undefined
(在严格模式下)而不是您的 user
对象。您可以使用 .bind()
解决此问题,如上所示。
仅供参考,这与 Express 没有任何关系。将对 obj.method
的引用作为回调传递时,这是一个普遍的问题,您希望存储一些代码然后稍后调用。您必须将对象“绑定”到它,以便使用正确的对象上下文调用它。
Nb. 这让我有点抓狂,我已经在这些房子周围转过几次了。然而,我对 ES6 和 JS 作为一个整体还是相当陌生,并且完全理解 JS Class 与其他语言中的 Classes 不同,并且可能完全错误地处理这个问题。
我正在 运行ning 以下代码,它在 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 模块,包含用于验证、更新等的所有功能,看起来像这样:
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()分开,并没有解决我如何从同一个 class 调用另一个方法的问题,例如 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
将是该方法内的 undefined
(在严格模式下)而不是您的 user
对象。您可以使用 .bind()
解决此问题,如上所示。
仅供参考,这与 Express 没有任何关系。将对 obj.method
的引用作为回调传递时,这是一个普遍的问题,您希望存储一些代码然后稍后调用。您必须将对象“绑定”到它,以便使用正确的对象上下文调用它。