【发布时间】:2020-06-06 07:34:35
【问题描述】:
我正在尝试在 Nestjs 中为 MongoDB 创建一个数据库连接提供程序。
我通过放置断点检查了user.controller.ts 和 mongoDbProvider,发现控制器在建立数据库连接之前获取。如何在控制器初始化之前建立数据库连接?
Nest.js 文档说 useFactory 方法将在任何其他依赖它的模块之前运行。
src/mongo-db/mongodb.provider.ts
import { MongoClient } from "mongodb";
import { MONGODB_PROVIDER } from "../constants";
export const mongoDbProviders = [
{
provide: MONGODB_PROVIDER,
useFactory: async () => {
MongoClient.connect('mongodb://localhost:27017',
{ useUnifiedTopology: true },
(error, client) => {
return client.db('nestjs-sample');
});
}
},
];
src/mongo-db/mongo-db.module.ts
import { mongoDbProviders } from './mongo-db.providers';
@Module({
providers: [...mongoDbProviders],
exports: [...mongoDbProviders],
})
export class MongoDbModule {
}
src/constants.ts
export const MONGODB_PROVIDER = 'MONGODB_CONNECTION';
我将MongoDbModule 导入到user.module.ts
src/user/user.module.ts
import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { UserService } from './user.service';
import { MongoDbModule } from 'src/mongo-db/mongo-db.module';
@Module({
imports: [MongoDbModule],
controllers: [UserController],
providers: [UserService]
})
export class UserModule {}
在这里,我将 db 从 mongoDbProvider 注入到 UserController 构造函数中。但是构造函数在 db 连接之前运行。
src/user/user.controller.ts
import { Controller, Post, Req, Get, Res, Inject } from '@nestjs/common';
import { Request, Response } from "express";
import { MONGODB_PROVIDER } from 'src/constants';
@Controller('users')
export class UserController {
constructor(@Inject(MONGODB_PROVIDER) private readonly db: any) {
}
@Post()
async create(@Req() request: Request, @Res() response: Response) {
this.db.collection('users').insertOne(request.body, (err, result) => {
if (err) {
response.status(500).json(err);
} else {
response.status(201);
response.send(result);
}
});
}
@Get()
get(@Req() request: Request, @Res() response: Response) {
response.status(400).json({
message: 'kidilam service'
});
}
}
【问题讨论】:
-
因此,此解决方案包含大量开销,您可以使用即用型和可用的开箱即用专用 @nestjs/mongoose 包省略这些开销。
标签: node.js mongodb typescript nestjs