亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在中間件中調用對象函數

在中間件中調用對象函數

皈依舞 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。


查看完整回答
反對 回復 2021-10-14
  • 1 回答
  • 0 關注
  • 173 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號