在中间件中调用对象函数

时间:2019-09-12 22:53:16

标签: javascript node.js express middleware

我的中间件中有以下代码:

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();
  },

我通常使用“ this”。调用对象中的函数和变量没有问题。我怀疑中间件中的“ next()”函数是导致在使用“ this”时出现以下错误的原因。调用函数。

  

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

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

'next()'函数是否破坏了正常功能?有没有一种方法可以正确使用“ this”。调用中间件中的函数?

1 个答案:

答案 0 :(得分: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值将由调用者如何调用该函数来决定,并且不会t是UserMiddleware对象。使用.bind(UserMiddleware)会强制设置所需的this值。 .bind()实际上创建了一个包装函数,唯一的工作就是重新附加所需的this值,并且该包装函数是作为中间件处理程序传递的。中间件基础结构用错误的this值调用包装函数,然后包装函数以所需的validateSignUp值调用this函数-可能使用.apply()

要查看.bind()的工作方式,您可以在MDN上看到它的here填充。有关如何设置this的值的更多讨论,请参见Six ways of setting this