如何让类转换正确地转换一个mongoDb类的_id?

piztneat  于 2023-01-20  发布在  Go
关注(0)|答案(3)|浏览(125)

我有下面的mongoDb类:

@Schema()
export class Poker {
  @Transform(({ value }) => value.toString())
  _id: ObjectId;

  @Prop()
  title: string;

  @Prop({ type: mongoose.Schema.Types.ObjectId, ref: User.name })
  @Type(() => User)
  author: User;
}

我返回的是在NestJs服务器中由class-transform转换的数据。
它会被拦截器转换:

@Get()
  @UseGuards(JwtAuthenticationGuard)
  @UseInterceptors(MongooseClassSerializerInterceptor(Poker))
  async findAll(@Req() req: RequestWithUser) {
    return this.pokersService.findAll(req.user);
  }

我不是拦截器的作者,但下面是它的实现方式:

function MongooseClassSerializerInterceptor(
  classToIntercept: Type,
): typeof ClassSerializerInterceptor {
  return class Interceptor extends ClassSerializerInterceptor {
    private changePlainObjectToClass(document: PlainLiteralObject) {
      if (!(document instanceof Document)) {
        return document;
      }

      return plainToClass(classToIntercept, document.toJSON());
    }

    private prepareResponse(
      response: PlainLiteralObject | PlainLiteralObject[],
    ) {
      if (Array.isArray(response)) {
        return response.map(this.changePlainObjectToClass);
      }

      return this.changePlainObjectToClass(response);
    }

    serialize(
      response: PlainLiteralObject | PlainLiteralObject[],
      options: ClassTransformOptions,
    ) {
      return super.serialize(this.prepareResponse(response), options);
    }
  };
}

export default MongooseClassSerializerInterceptor;

我遇到的问题是,当我对我的控制器返回进行console.log时,我得到了这个:

[
  {
    _id: new ObjectId("61f030a9527e209d8cad179b"),
    author: {
      _id: new ObjectId("61f03085527e209d8cad1793"),
      password: '--------------------------',
      name: '----------',
      email: '-------------',
      __v: 0
    },
    title: 'Wonderfull first poker2',
    __v: 0
  }
]

但我得到了这个

[
    {
        "_id": "61f5149643092051ba048c6e",
        "author": {
            "_id": "61f5149643092051ba048c6f",
            "name": "----------",
            "email": "-------------",
            "__v": 0
        },
        "title": "Wonderfull first poker2",
        "__v": 0
    }
]

如果你检查id,它是完全不一样的,然后客户端将要求一些数据为这个ID,并收到什么。
你知道我错过了什么吗?
此外,每次我发出Get请求时,我都会收到不同的值。

t9aqgxwy

t9aqgxwy1#

尝试将此用于_id:

@Transform(params => params.obj._id)

更一般的情况是:

@Transform(({ key, obj }) => obj[key])

遇到同样的问题,用这种方法解决了它。params.obj是一个原始对象。不幸的是,我不知道,为什么类转换器在默认情况下没有正确定义_id。

w80xi6nr

w80xi6nr2#

最终它被解决了

@Transform((value) => value.obj._id.toString())

多亏了J4N

h4cxqtbf

h4cxqtbf3#

如果您想直接更改模式,并且只使用mongoose,那么您将得到如下所示的模式。

const mongoose = require('mongoose')

const mySchema = new mongoose.Schema({
    field: String
}, {
    toJSON: {
        transform(doc, ret) {
            ret.id = ret._id;
            delete ret._id;
            delete ret.__v;
        }
    }
})

module.exports = mongoose.model("MySchema", mySchema)

但是如果你使用的是@nestjs/mongoose,你应该有如下的用法。

import { Document } from 'mongoose';
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';

export type MyDocument = MyClass & Document;

@Schema({
  toJSON: {
    transform(doc, ret) {
      ret.id = ret._id;
      delete ret._id;
      delete ret.__v;
    },
  },
})
export class MyClass {
  @Prop()
  field: string;
}

export const MySchema = SchemaFactory.createForClass(MyClass);

回想一下,在第一个示例中,new mongoose.Schema函数的第一个参数是schema对象,第二个参数是schema选项。因此,@Schema decarator拥有的类schema对象,它将包含的参数是Schema选项!

相关问题