NodeJS TypeError:存储库方法不是函数(NestJS / TypeORM)

c7rzv4ha  于 2022-12-22  发布在  Node.js
关注(0)|答案(8)|浏览(248)

我正在使用NestJS和TypeORM。当尝试调用存储库的createMailLogEntry方法时,我收到以下错误:第一个月
我不知道出了什么问题。

邮寄.服务.ts

@Injectable()
export class MailingService {

    constructor(@InjectRepository(MailLogEntryRepository) private mailLogEntryRepository: MailLogEntryRepository) { }

        // ...

        if(transferResult) {
            await this.mailLogEntryRepository.createMailLogEntry({
                creationDate: new Date(Date.now()),
                from: mailContent.from,
                to: mailContent.to,
                subject: mailContent.subject,
                text: mailContent.text,
                html: mailContent.html,
                cc: mailContent.cc,
                bcc: mailContent.bcc,
            });
        }
    }
}

邮件日志条目.存储库.ts

@EntityRepository(MailLogEntry)
export class MailLogEntryRepository extends Repository<MailLogEntry> {

    async createMailLogEntry(mailLogEntryDto: MailLogEntryDto): Promise<MailLogEntry> {
        const mailLogEntry = MailLogEntryRepository.createMailLogEntryFromDto(mailLogEntryDto);
        return await mailLogEntry.save();
    }

    private static createMailLogEntryFromDto(mailLogEntryDto: MailLogEntryDto): MailLogEntry {
        const mailLogEntry = new MailLogEntry();
        mailLogEntry.from = mailLogEntryDto.from;
        mailLogEntry.to = mailLogEntryDto.to;
        mailLogEntry.subject = mailLogEntryDto.subject;
        mailLogEntry.text = mailLogEntryDto.text;
        mailLogEntry.html = mailLogEntryDto.html;
        mailLogEntry.cc = mailLogEntryDto.cc;
        mailLogEntry.bcc = mailLogEntryDto.bcc;

        return mailLogEntry;
    }
}
hfwmuf9z

hfwmuf9z1#

我也遇到过这个问题。请确保您正在将存储库导入模块。
下面是您的模块可能的外观。

@Module({
  imports: [TypeOrmModule.forFeature([TeamRepository])],
  providers: [TeamService],
  controllers: [TeamController]
})
export class TeamModule {}
l0oc07j2

l0oc07j22#

我也有同样的问题,我会告诉你是什么让我摆脱了它,如果它帮助别人!
如果您的存储库是手工创建的(不是由ORM生成的),那么您就不能使用存储库注入:

相反,只需像对服务那样使用存储库(只需删除@InjectRepository(People)):

我希望这会有帮助!编码快乐!
附言:个人是我的实体,帮助者与问题无关

vzgqcmou

vzgqcmou3#

也许这也会有帮助,这与@Simple Dev关于手工仓库的回答有关。例如,如果你创建一个实体,服务和仓库类有不同的名称,当你试图从服务调用仓库成员函数时,可能会没有定义。例如:

@Entity
export class Person { ... }

@Injectable()
export class OtherPersonService { ... }  // Person !== OtherPerson

@EntityRepository(Person)
export class OtherPersonRepository extends Repository<Person> { ... } // Same problem

我也遇到过这个问题,在重命名我的服务和仓库后,错误消失了。对于前面的例子,解决方案是:人员人员服务人员存储库

zd287kbt

zd287kbt4#

对我来说,我已经将实体和该实体的自定义存储库一起导入。

@Module({
  imports: [TypeOrmModule.forFeature([
  TeamRepository,
  Team   // either the entity or the custom repository should be imported.
  ])],
  providers: [TeamService],
  controllers: [TeamController]
})
export class TeamModule {}
nwwlzxa7

nwwlzxa75#

我知道这是一个老问题,但我将把它留在这里,希望它可能会帮助到某人。您可以消除*repository*文件,并在服务的构造函数上使用@InjectRepository。然后,您可以访问服务上的所有存储库方法。请确保在模块的导入中包括TypeOrmModule.forFeature上的实体。
这里Product是我的实体,这是我从控制器调用的服务文件(ProductService)。

@Injectable()
export class ProductService {
 private logger = new Logger('ProductService');
 constructor(
  @InjectRepository(Product)
  private productRepository: Repository<Product>
 ) { }

 async getAllAsync(): Promise<Product[]> {
  return await this.productRepository.find();
 }

 async getCountAsync(): Promise<number> {
  return await this.productRepository.count();
 }
}
mutmk8jj

mutmk8jj6#

@MFuat,是的,今天早上终于修好了,我的也是和单元测试user.service.ts文件有关,原来我不是在嘲笑我测试文件里的register方法,所以我一嘲笑,测试就通过了。

const mockUserRepository = {
  register: jest.fn().mockResolvedValue('sampleResolvedValue')
};
aamkag61

aamkag617#

在新的TypeORM版本(0.3. )中,将自定义存储库更改为服务https://typeorm.io/custom-repository,这是一个稍微不同的方法,因此当前代码使用*@EntityRepository(MyEntity)**将不起作用。

exampleQueryBuilder() {
    return this.createQueryBuilder() ...
}

改为:

exampleQueryBuilder() {
    return this.dataSource
          .getRepository(Person)
          .createQueryBuilder() ...
}

除了其余的更改之外,可以使用DataSource以下面的方式实现自定义存储库,这对我来说似乎很简单:

// account.repository.ts
@Injectable()
export class AccountsRepository extends Repository<AccountsEntity> {
    constructor(private dataSource: DataSource) {
        super(AccountsEntity, dataSource.createEntityManager());
    }

    async getByUsername(username: string) {
        return this.findOne({ where: { username } });
    }
    // ...
}

然后将存储库注入到服务中。

// account.service.ts
export class AccountService {
    constructor(private readonly accountRepository: AccountRepository) {}

    async getByUsername(username: string): Promise<Account> {
        return this.accountRepository.getByUsername(username);
    }
    // ...
}

并且该模块具有用于该特征和作为提供者的储存库的导入。

// account.module.ts
@Module({
    imports: [
        TypeOrmModule.forFeature([AccountEntity])],
    // ...
  ],
    providers: [AccountService, AccountRepository],
    // ...
})
export class AccountModule { }
oalqel3c

oalqel3c8#

我以前遇到过这个问题。它说函数是未定义的。我尝试了很多解决方案,但没有运气,然后我只是将回购名称从付款改为付款,它与我工作。所以尝试更改回购名称

相关问题