[英]this is undefined outside from constructor
我使用帶有Inversify的依賴注入創建了一個Express REST API。 我有一個基本的控制器類
import { Request, Response, NextFunction } from 'express';
import { injectable, inject } from 'inversify';
import { IUserController } from './IUserController';
import { AppEntity } from '../../enterpriseBusinessRules/entities/AppEntity';
import { UserEntity } from '../../enterpriseBusinessRules/entities/UserEntity';
import { GroupEntity } from '../../enterpriseBusinessRules/entities/GroupEntity';
import { IUserUseCases } from '../../applicationBusinessRules/useCases/IUserUseCases';
import { IOCTypes } from '../../iOC/IOCTypes';
@injectable()
export class UserController implements IUserController {
public userUseCases: IUserUseCases;
constructor(@inject(IOCTypes.IUserUseCases) userUseCases: IUserUseCases) {
this.userUseCases = userUseCases;
}
public async fetchUsers(request: Request, response: Response, next: NextFunction): Promise<void>{
try {
const users: UserEntity[] = await this.userUseCases.fetchUsers(request);
response.status(200).json({
message: 'Users were fetched.',
users,
});
} catch (error) {
next(error);
}
}
}
每當我請求路由/users
,函數fetchUsers
都會被執行。 不幸的是,我的API崩潰並拋出此錯誤
RangeError [ERR_HTTP_INVALID_STATUS_CODE]:無效的狀態碼:undefined
我調試並發現了這個錯誤
TypeError:無法讀取未定義的屬性“userUseCases”
在類的構造函數中, this
是設置並且工作正常。 在fetchUsers
函數中, this
是undefined
。 我怎樣才能解決這個問題? 因為我必須使用this
來訪問我的userUseCases
變量。
編輯:感謝Adam Kosmalas的評論我能夠通過綁定構造函數中的函數來解決它
this.fetchUsers = this.fetchUsers.bind(this)
但我不知道這是否是最佳解決方案。 然后我將必須綁定其構造函數中的每個類中的每個函數...
還有其他想法嗎?
在構造函數內部使用bind(this)
將“this”綁定到您的函數,這將確保它將在類的“this”上下文中執行該函數。
constructor(@inject(IOCTypes.IUserUseCases) userUseCases: IUserUseCases) {
this.userUseCases = userUseCases;
this.fetchUsers = this.fetchUsers.bind(this)
}
它沒有工作,因為你的功能正在其他地方執行,因此從那里得到'這個'
如果您不想綁定並且屬性是公共的,那么您可以直接從服務外部訪問。
const users: UserEntity[] = await this.nameOfTheImportedService.userUseCases.fetchUsers(request);
另一個選項是使用箭頭函數進行方法聲明。 這樣您就不需要顯式綁定this
:
public fetchUsers = async (request: Request, response: Response, next: NextFunction): Promise<void> => {
try {
const users: UserEntity[] = await this.userUseCases.fetchUsers(request);
response.status(200).json({
message: 'Users were fetched.',
users,
});
} catch (error) {
next(error);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.