(Express、Node、Typescript、REST API)如何将服务中的函数导入控制器?属性 ... 在 typeof 类型上不存在

成人

我应该如何在 Controller 中导入 loginMember?我正在开发 REST API,现在我需要在不同的文件位置使用代码。我在控制器中有错误。当我调用 loginMember 时。(找不到名称 'loginMember'.ts(2304))

服务

import MembersModel from '../models/MembersModel';
import BaseService from './BaseService';
import { createPasswordToHash } from '../scripts/utils/auth';
class MembersService extends BaseService {  
  constructor() {
    super(MembersModel);
  }

  // loginMember
  loginMember = async (email: any, password: any) => {
    return new Promise(async (resolve, reject) => {
      try {
        let data = await this.BaseModel.findOne({
          email: email,
          password: createPasswordToHash(password),
        });
        return resolve(data);
      } catch (error) {
        return reject(error);
      }
    });
  };
  
}

export default MembersService;

控制器

import BaseController from './BaseController';
import MembersService from '../services/MembersService';
import ApiError from '../errors/ApiError';
import { NextFunction, Request, Response } from 'express';
import { createPasswordToHash, generateAccessToken } from '../scripts/utils/auth';
import httpStatus from 'http-status';

class MembersController extends BaseController {
  constructor(membersService: MembersService) {
    super(membersService);    
  }

login = (req: Request, res: Response, next: NextFunction) => {
  MembersService.loginMember(req.body)
    .then((response: any) => {
      if (response) {
        const member = {
          ...response.toObject(),
          accessToken: generateAccessToken(response.toObject()),
        };
        delete member.password;
        delete member.createdAt;
        delete member.updatedAt;
        return res.status(httpStatus.OK).send(member);
      }
      return res.status(httpStatus.UNAUTHORIZED).send({ error: 'Invalid email or password' });
    })
    .catch((err: { message: string }) => {
      return next(
        new ApiError(err.message, httpStatus.UNAUTHORIZED, 'login', req.headers['user-agent']?.toString() || 'Unknown')
      );
    });
};
  
}
export default new MembersController(new MembersService());

现在我遇到了新错误:“类型'typeof MembersService'.ts(2339)上不存在属性'loginMember'”

泽夫贡

您试图loginMember作为静态方法调用,但它没有被定义为一个。您必须使用的实例MembersService才能使用该方法。由于您MembersController已经使用MembersService实例进行了初始化,因此您可能只想membersServiceMembersController. 此外,该loginMember方法需要电子邮件和密码,因此您必须显式传递这些参数,而不仅仅是传递请求正文。(虽然我不确定电子邮件和密码在请求正文中的位置,所以我无法帮助您。)因此,通过这些更改,它看起来像:

class MembersController extends BaseController {
  private membersService: MembersService;

  constructor(membersService: MembersService) {
    super(membersService);
    this.membersService = membersService;
  }

login = (req: Request, res: Response, next: NextFunction) => {
  this.membersService.loginMember(email, password) // <- Get these from the request
    .then((response: any) => {
      if (response) {
        const member = {
          ...response.toObject(),
          accessToken: generateAccessToken(response.toObject()),
        };
        delete member.password;
        delete member.createdAt;
        delete member.updatedAt;
        return res.status(httpStatus.OK).send(member);
      }
      return res.status(httpStatus.UNAUTHORIZED).send({ error: 'Invalid email or password' });
    })
    .catch((err: { message: string }) => {
      return next(
        new ApiError(err.message, httpStatus.UNAUTHORIZED, 'login', req.headers['user-agent']?.toString() || 'Unknown')
      );
    });
};

另一种代码风格建议是使用async await而不是.thenlogin方法中。此外,方法中的 Promise 包装loginMember看起来没有必要,并且使用 async 函数作为参数是一种反模式在避免这些陷阱的同时,以下内容应该可以完成工作:

  loginMember = (email: any, password: any): Promise<Response> => {
    return this.BaseModel.findOne({
      email: email,
      password: createPasswordToHash(password),
    });
  };

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章