皈依舞
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
。
添加回答
舉報
0/150
提交
取消