簡體   English   中英

NestJs:如何注入一個具有 Mongoose Model 構造函數的 Provider?

[英]NestJs: How can I inject a Provider that has a constructor with a Mongoose Model?

您好我在 NestJS 中有以下代碼。我正在使用 moduleRef 並聲明了一個名為“blogService”的自定義提供程序。但是我收到一條錯誤消息:

'Nest 無法解析 blogService 的依賴項(?)。 請確保索引 [0] 處的參數 BlogModel 在 AppModule 上下文中可用。

.在聲明導致此錯誤的自定義提供程序時,我到底做錯了什么,因為我似乎也在注入 Mongoose Model?

應用程序模塊.ts

import { BlogService } from './blog/service/blog.service';
import { Blog } from './blog/schema/blog.schema';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule } from '@nestjs/config';
import { MongooseModule, getModelToken } from '@nestjs/mongoose';

        @Module({
          imports: [
            ConfigModule.forRoot({ isGlobal: true, load: [configuration], }),
            MongooseModule.forRoot(process.env.DATABASE_URL)
          ],
          controllers: [AppController],
          providers: [AppService, {
            provide: 'blogService',
            useFactory: () => BlogService,
            inject: [getModelToken(Blog.name)]
          }],
        
        })

app.controller.ts

import { Controller, Get } from '@nestjs/common';
import { ModuleRef } from '@nestjs/core';
import { BlogService } from './blog/service/blog.service';

@Controller()
export class AppController {
  constructor(private readonly modelRef: ModuleRef) { }

  @Get('blogs')
  async getAllBlogs(): Promise<any> {
    const response = await this.modelRef.get('blogService', { strict: false }).getAllBlogs();
    return response;
  }
}

博客.service.ts

import { Injectable, HttpException, HttpStatus, Logger } from '@nestjs/common';
import { Blog } from '../schema/blog.schema';
import { InjectModel } from '@nestjs/mongoose';
import { Model, Types } from 'mongoose';


@Injectable()
export class BlogService {

    private readonly logger = new Logger(BlogService.name);

    constructor(@InjectModel(Blog.name) private blogModel: Model<Blog>) { }


    async getAllBlogs() {
        try {
            const blogs = await this.blogModel.find().exec();
            return blogs;
        } catch (error) {
            this.logger.error(error.message);
        }
    }

}

除了可能的學術目的之外,不太確定為什么要為此制作自定義提供程序。 無論哪種方式,對於任何你想要@InjectModel()或使用getModelToken()的東西,你都需要調用MongooseModule.forFeature()來注冊@nestjs/mongoose mongoose package 將為你創建的自定義提供程序。 一旦你有了這個,你就可以使用@InjectModel()或像這樣的自定義提供者

{
  provide: 'blogService',
  inject: [getModelToken(Blog.name)],
  useFactory: (model: Model<Blog>) => new BlogService(model)
}

暫無
暫無

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

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