簡體   English   中英

Typescript ExpressJS - 將服務注入 REST API 控制器

[英]Typescript ExpressJS - injecting services into REST API Controllers

我正在嘗試對我的快遞 rest API 使用 OOP 方法,其中 Z9327DAFFB330417F817934CC99Z5 存在問題。

這個想法是有一個 AuthController class 調用私有 AuthService class 與數據庫交互。 但是,當我嘗試使用 AuthController class 調用 AuthService class 時,它總是返回未定義。

應用程序 class 初始化我的快速應用程序並注冊我的控制器:

class App {
  private app;
  private controllers: Controller[];
  constructor(controllers: Controller[]) {
    this.app = express();
    this.controllers = controllers;
    this.config();
    this.initializeRoutes();
    this.initializeErrorHandler();
  }

  config() {
    console.log("running config");
    this.app.use(cors());
    this.app.use(express.json());
    this.app.use(helmet());
  }

  public listen() {
    this.app.listen(3000);
  }

  initializeRoutes() {
    this.controllers.forEach((controller: any) => {
      this.app.use("/", controller.router);
    });
  }
  initializeErrorHandler() {
    this.app.use(errorMiddleware);
  }
}

(async () => {
  try {
    await connection(); //creates my database connection
  } catch (error) {
    console.log("Error while connecting to the database", error);
    return error;
  }
  const app = new App([new AuthController()]);
  app.listen();
})();

這是我在調用const app = new App([new AuthController()]);時初始化的 AuthController

export default class AuthController implements Controller {
  public path = "/api/auth";
  public router = Router();
  private authService: AuthService = new AuthService();

  constructor() {
    this.initializeRoutes();
  }

  public initializeRoutes() {
    //login route
    this.router.post(this.path.concat("/login"), this.login);
    this.router.post(
      this.path.concat("/register"),
      validationMiddleware(CreateUserDto),
      this.register
    );
    this.router.post(this.path.concat("/resetpassword"), this.resetPassword);
    this.router.post(this.path.concat("/newpassword"), this.newPassword);
  }

  public async register(req: Request, res: Response, next: NextFunction) {
    const userData: CreateUserDto = req.body;
    try {
      let {
        tokens: { xAuthToken, xRefreshToken },
        user,
      } = await this.authService.register(userData);
      res.setHeader("x-auth-token", xAuthToken);
      res.setHeader("x-refresh-token", xRefreshToken);
      res.json(user);
    } catch (e) {
      next(e);
    }
  }
}

最后是 AuthService class

export class AuthService {
  private userRepo: Repository<User> = getRepository(User);

  constructor() {}

  public async register(userData: CreateUserDto) {
    let foundUser = await this.userRepo.findOne({
      where: { email: userData.email.toLowerCase() },
    });
    console.log(foundUser);
    if (foundUser) {
      throw new EmailInUseException();
    } else {
      console.log(foundUser);
      const user = new User();
      user.email = userData.email.toLowerCase();
      user.password = userData.password;
      await this.userRepo.save(user);
      const tokens = this.createTokens(user);
      return {
        tokens,
        user,
      };
    }
  }
}

每當我從 AuthController 調用 AuthService 時,我都會收到“錯誤無法讀取未定義的屬性 'authService'”。

我嘗試更改代碼以直接初始化 AuthService const app = new App([new AuthController(new AuthService()]);但這並不能解決問題。

任何幫助表示贊賞!

發現了問題。 'this' 上下文正在改變。 我將“注冊”方法切換為箭頭 function 解決了問題

原來的:

class AuthController{


  public async register(req: Request, res: Response, next: NextFunction) {
    const userData: CreateUserDto = req.body;
    try {
      let {
        tokens: { xAuthToken, xRefreshToken },
        user,
      } = await this.authService.register(userData);
      res.setHeader("x-auth-token", xAuthToken);
      res.setHeader("x-refresh-token", xRefreshToken);
      res.json(user);
    } catch (e) {
      next(e);
    }
  }

}

新的:

class AuthController{


public register = async (req: Request, res: Response, next: NextFunction) => {
    const userData: CreateUserDto = req.body;
    try {
      let {
        tokens: { xAuthToken, xRefreshToken },
        user,
      } = await this.authService.register(userData);
      res.setHeader("x-auth-token", xAuthToken);
      res.setHeader("x-refresh-token", xRefreshToken);
      res.json(user);
    } catch (e) {
      next(e);
    }
  };
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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