簡體   English   中英

這是構造函數之外的未定義

[英]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函數中, thisundefined 我怎樣才能解決這個問題? 因為我必須使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM