NestJS中使用Mongoose+TypeScript为何能自动将_id转换为id?
原因分析
- Mongoose 内置虚拟
id属性
Mongoose 所有查询返回的文档实例,默认会挂载一个虚拟属性id,本质是对MongoDB原生_id字段调用toString()方法的返回值,不需要你在Schema或者自定义接口里手动定义,也不会持久化存储到MongoDB中,只是运行时可访问的getter属性,所以访问时不会报运行时错误。 - TypeScript 类型未报错的原因
你注入的productModel类型是Model<Product>,Mongoose的Model类型执行查询后返回的是Mongoose Document实例,这个实例的类型本身就继承了Mongoose内置的Document接口,该接口已经预先声明了id、_id等通用字段的类型,所以即使你自定义的Product接口没有写id属性,TypeScript也不会抛出类型错误。
扩展说明
如果你不需要这个默认的虚拟id属性,可以在定义Schema的时候手动关闭:
export const ProductSchema = new mg.Schema( { title: { type : String, required: true}, description: { type : String, required: true}, price: { type: Number, required: true} }, { id: false } // 关闭默认id虚拟属性 )
关闭之后再访问product.id就会抛出未定义的错误,只能通过product._id访问MongoDB原生的主键。
内容的提问来源于stack exchange,提问作者EyeQ Tech
相关产品推荐
相关产品推荐

