我的中间件中有以下代码:
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”。调用中间件中的函数?
答案 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
。