node.js - NestJs/Mongoose 中的自动增量序列

标签 node.js mongodb mongoose nestjs mongoose-sequence

我正在将 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 使用依赖注入(inject),访问 native 连接并不是那么直接。根据documentation to integrate MongoDB using Mongoose可以使用 @InjectConnection() 访问 native Mongoose Connection 对象。装饰器如下:
@Injectable()
export class CatsService {
  constructor(@InjectConnection() private connection: Connection) {}
}
但是自从TypeScript decorators只能附加到类声明、方法、访问器、属性或参数我看不到如何注入(inject)连接、需要插件并在我的模式类上初始化它。

最佳答案

可以使用 forFeatureAsync() 为给定模式注册插件。 MongooseModule 的方法以及工厂供应商(即 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 plugin 必须将 native Mongoose 连接对象传递给插件初始化。这可以通过使用 getConnectionToken 将连接注入(inject)工厂提供程序来实现。方法:
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 {}

关于node.js - NestJs/Mongoose 中的自动增量序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62824276/

相关文章:

javascript - Mongoose 的 promise

mongodb - Mongoose/MongoDB - 附加到文档对象数组的简单示例,具有预定义的模式

java - 瑞士电信应用云 : nodejs with java jdk

javascript - 在 Node.js 中实现通知队列

python - 从heroku控制台连接到MongoHQ(heroku run python)

node.js - 在没有 $unwind 的情况下查找数组内的重复项

javascript/node.js 从函数内部的函数回调数据

node.js - 如何解决 d3-array/src/number.js : unknown Statement of type "ForOfStatement" 语法错误

javascript - Mongoose 找不到所需的输出

javascript - ( Node :45207) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]