我的中间件中有此代码:const UserMiddleware = { isNumber(n) { return !Number.isNaN(parseFloat(n)) && !Number.isNaN(n - 0); }, // eslint-disable-next-line consistent-return validateSignUp(req, res, next) { const allSignUpErrors = []; console.log(this.isNumber(5)); if (this.isNumber(req.body.first_name)) { allSignUpErrors.push('First name must be a text value'); } if (allSignUpErrors.length !== 0) { return res.status(400).json({ status: 400, error: allSignUpErrors, }); } next(); },我通常使用“这个”。可以毫无问题地调用对象中的函数和变量。我怀疑中间件中的“next()”函数是导致我在使用“this”时出现以下错误的原因。调用一个函数。类型错误:无法读取未定义的属性“isNumber”我曾尝试使用“绑定”来调用该函数,但仍然会出现“未定义”错误。'next()' 函数是否破坏了正常功能?有没有办法正确使用“这个”。在中间件中调用函数?
1 回答
![?](http://img1.sycdn.imooc.com/5458477300014deb02200220-100-100.jpg)
喵喵时光机
TA贡献1846条经验 获得超7个赞
改变:
this.isNumber(...)
到:
UserMiddleware.isNumber(...)
除非您在将其作为中间件传递时专门使用或某些类似技术,否则this
中间件函数内部的值不会是您的UserMiddleware
对象.bind()
。
如需更多选项的帮助,请向我们展示您使用的代码validateSignUp()
。
例如,如果您正在执行以下操作:
app.use(UserMiddleware.validateSignUp);
然后,您可以this
使用.bind()
如下方式设置所需的值:
app.use(UserMiddleware.validateSignUp.bind(userMiddleware));
传递UserMiddleware.validateSignUp
给函数会立即失去与UserMiddleware
对象的关联,并且该this
函数被调用时的值将取决于调用者如何调用该函数而不是该UserMiddleware
对象。使用.bind(UserMiddleware)
强制设置所需的this
值。 .bind()
实际上创建了一个包装函数,它的唯一工作是重新附加所需的this
值,而该包装函数是作为中间件处理程序传递的。中间件基础结构使用错误的this
值调用包装函数,然后包装validateSignUp
函数使用所需的值调用您的函数this
- 可能使用.apply()
.
为了看看如何.bind()
工作,你可以看到一个填充工具为它在这里的MDN。有关如何this
设置的值的更多讨论,请参阅设置 的六种方式this
。
添加回答
举报
0/150
提交
取消