#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
.