我正在将一个NodeJs项目迁移到NestJs,这个项目使用MongoDB作为后端数据库,Mongoose作为ODM。我使用mongoose-sequence插件来处理自动增量序列,但是我遇到了在NestJs下需要这个库的问题。
mongoose-sequence文档解释了如何使用CommonJS语法导入库,如下所示:
const mongoose = require('mongoose')
const AutoIncrementFactory = require('mongoose-sequence');
const connection = await mongoose.createConnection('mongodb://...');
const AutoIncrement = AutoIncrementFactory(connection);使用ES6导入语法,应该是这样的:
import * as mongoose from 'mongoose';
import * as AutoIncrementFactory from 'mongoose-sequence';
const connection = ...;
const AutoIncrement = AutoIncrementFactory(connection);然而,由于NestJs使用依赖注入,访问本机连接就不那么直接了。根据documentation to integrate MongoDB using Mongoose,可以使用@InjectConnection()装饰器访问本地Mongoose连接对象,如下所示:
@Injectable()
export class CatsService {
constructor(@InjectConnection() private connection: Connection) {}
}但是由于TypeScript decorators只能附加到类声明、方法、访问器、属性或参数,所以我不知道如何注入连接、请求插件并在我的Schema类上初始化它。
发布于 2020-07-10 12:36:21
可以使用MongooseModule的forFeatureAsync()方法和工厂提供程序(即useFactory)为给定的模式注册插件。
遵循official documentation中的示例
@Module({
imports: [
MongooseModule.forFeatureAsync([
{
name: Cat.name,
useFactory: () => {
const schema = CatsSchema;
schema.plugin(require('mongoose-autopopulate'));
return schema;
},
},
]),
],
})
export class AppModule {}但是,对于mongoose-sequence插件,需要将本机Mongoose连接对象传递给插件初始化。这可以通过使用getConnectionToken方法将连接注入到工厂提供程序中来实现:
import {getConnectionToken, MongooseModule} from '@nestjs/mongoose';
import * as AutoIncrementFactory from 'mongoose-sequence';
@Module({
imports: [
MongooseModule.forFeatureAsync([
{
name: Cat.name,
useFactory: async (connection: Connection) => {
const schema = CatsSchema;
const AutoIncrement = AutoIncrementFactory(connection);
schema.plugin(AutoIncrement, {inc_field: 'id'});
return schema;
},
inject: [getConnectionToken('YOUR_CONNECTION_NAME')],
},
]),
],
})
export class AppModule {}https://stackoverflow.com/questions/62824276
复制相似问题