Как использовать сервис / модуль внутри другого модуля?

#javascript #nestjs

#javascript #nestjs

Вопрос:

В файле main.ts моего приложения NestJS я хотел бы добавить некоторые данные об элементах в свою базу данных, если приложение запускается в режиме разработки:

 const app = await NestFactory.create(AppModule)
await app.listen(port, async () => {

  if (!production) {
    const User = this.db.collection('user')
    await User.deleteMany({})
    await User.insertMany(user)
  }
})
 

Конечно, это не работает, так как db в настоящее время у меня его нет.

Я определяю подключение к базе данных в модуле, и вот как выглядит мой database.module.ts. Можно ли поместить части fixtures (удалить базу данных и добавить данные об инструментах) в database.module? Причина, по которой я думаю, что должен добавить его в main.ts, заключается в том, что мне нужно запускать его при запуске приложения, а не при каждом подключении к БД.

 import { Module, Inject } from '@nestjs/common'
import { MongoClient, Db } from 'mongodb'

@Module({
  providers: [
    {
      provide: 'DATABASE_CLIENT',
      useFactory: () => ({ client: null })
    },
    {
      provide: 'DATABASE_CONNECTION',
      inject: ['DATABASE_CLIENT'],
      useFactory: async (dbClient): Promise<Db> => {
        try {
          const client = await MongoClient.connect('mongodb://localhost:27017')
          dbClient.client = client
          const db = client.db('database')
          return db
        } catch (error) {
          console.error(error)
          throw error
        }
      }
    }
  ],
  exports: ['DATABASE_CONNECTION', 'DATABASE_CLIENT']
})
export class DatabaseModule {
  constructor(@Inject('DATABASE_CLIENT') private dbClient) {}
  async onModuleDestroy() {
    await this.dbClient.client.close()
  }
}
 

При этом я могу использовать свою БД в любом другом модуле, но это не помогает мне получить подключение к БД при запуске приложения:

 import { Module } from '@nestjs/common'
import { MyService } from './my.service'
import { MyResolvers } from './my.resolvers'
import { DatabaseModule } from '../database.module'

@Module({
  imports: [DatabaseModule],
  providers: [MyService, MyResolvers]
})
export class MyModule {}
 

Ответ №1:

Если вы хотите получить клиент базы данных в своем main.ts , вам нужно войти в клиент из контейнерной системы, которая есть в nest. Вы можете сделать это с помощью следующей строки, используемой перед вашим app.listen()

 const db = app.get('DATABASE_CLIENT', { strict: false })
 

И тогда вместо this.db того, чтобы просто использовать db.client.collection()

Комментарии:

1. TypeError: db.connection is not a function . Выполнение console.log(db.client) дает мне клиента, но я не понимаю, как получить определенную коллекцию…

2. Исправлены некоторые опечатки. Извините за это

3. Все еще получаю TypeError: db.client.collection is not a function

4. С вашим решением я должен сделать db.client.db('database').collection('user') , но я хотел бы использовать уже настроенное в модуле подключение к БД

5. Тогда вы, вероятно, могли бы использовать DATABASE_CONNECTION вместо DATABASE_CLIENT .