【问题标题】:Calling object functions in middleware在中间件中调用对象函数
【发布时间】:2019-09-12 22:53:16
【问题描述】:

我的中间件中有这段代码:

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”时出现以下错误的原因。调用函数。

TypeError: 无法读取未定义的属性“isNumber”

我尝试使用'bind'调用函数,但'undefined'错误仍然出现。

'next()' 函数是否破坏了正常功能?有没有办法正确使用“这个”。调用中间件中的函数?

【问题讨论】:

    标签: javascript node.js express middleware


    【解决方案1】:

    变化:

    this.isNumber(...)
    

    到:

    UserMiddleware.isNumber(...)
    

    中间件函数内的this 的值不会是您的UserMiddleware 对象,除非您在将其作为中间件传递时特别使用了.bind() 或一些类似的技术。


    如需更多选项的帮助,请向我们展示您使用 validateSignUp() 的代码。

    例如,如果你在做:

    app.use(UserMiddleware.validateSignUp);
    

    然后,您可以像这样使用.bind()this 设置所需的值:

    app.use(UserMiddleware.validateSignUp.bind(userMiddleware));
    

    UserMiddleware.validateSignUp 传递给函数会立即失去与UserMiddleware 对象的关联,并且在调用该函数时this 值将由调用者调用函数的方式决定,而不是UserMiddleware目的。使用.bind(UserMiddleware) 强制设置所需的this 值。 .bind() 实际上创建了一个包装函数,它的唯一工作是重新附加所需的 this 值,并且该包装函数是作为中间件处理程序传递的。中间件基础结构使用错误的this 值调用包装器函数,然后包装器函数使用所需的this 值调用您的validateSignUp 函数——可能使用.apply()

    要了解 .bind() 的工作原理,您可以在 MDN 上查看 here 的 polyfill。有关如何设置this 值的更多讨论,请参阅Six ways of setting this

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-28
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 2015-11-02
      • 1970-01-01
      相关资源
      最近更新 更多