在中间件中调用对象函数

我的中间件中有此代码:


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()' 函数是否破坏了正常功能?有没有办法正确使用“这个”。在中间件中调用函数?


皈依舞
浏览 150回答 1
1回答

喵喵时光机

改变: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。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript