为了账号安全,请及时绑定邮箱和手机立即绑定

在中间件中调用对象函数

在中间件中调用对象函数

皈依舞 2021-10-14 16:55:05
我的中间件中有此代码: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 回答

?
喵喵时光机

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


查看完整回答
反对 回复 2021-10-14
  • 1 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信