【问题标题】:Alter JSON response in nestjs在 nestjs 中更改 JSON 响应
【发布时间】:2019-12-15 21:34:17
【问题描述】:

我正在使用 node、nestjs 和 mongoose,我编写了一个 get 调用并得到类似的结果

[
 {
    "_id": "5d4a9c0b1a6bcf14775c953c",
    "material_name": "ramboo",
    "material_status": 0,
    "is_admin_approved": true,
    "createdAt": "2019-08-07T09:38:19.237Z",
    "updatedAt": "2019-08-07T09:38:19.237Z",
    "id": "5d4a9c0b1a6bcf14775c953c"
}
]

这样的服务(material.service.ts)

async findAll(): Promise<IDMaterial[]> {
  return await this.materialModel.find({is_admin_approved: true});
  }

如何从结果中删除 is_admin_approved 字段

[
 {
    "_id": "5d4a9c0b1a6bcf14775c953c",
    "material_name": "ramboo",
    "material_status": 0,
    "createdAt": "2019-08-07T09:38:19.237Z",
    "updatedAt": "2019-08-07T09:38:19.237Z",
    "id": "5d4a9c0b1a6bcf14775c953c"
}
]

如何解决这个问题请帮助我?

【问题讨论】:

    标签: node.js express nestjs


    【解决方案1】:

    希望此代码可以帮助您。存储结果,然后从您获取的每个对象中迭代和删除项目。然后返回更改后的对象数组。

    async findAll(): Promise<IDMaterial[]> {
      const result = await this.materialModel.find({is_admin_approved: true});
      result.map(elem => delete elem.is_admin_approved)
      return result;
    }
    

    【讨论】:

    • 删除操作符的操作数不能是只读属性。显示此错误
    • 嗯...无论如何,在带有 const 的 codePen 中效果很好,而不是“const”切换到“let”,它应该可以工作。
    【解决方案2】:

    您可以使用 lodash 的 omit 函数从数组中的每个对象中省略 is_admin_approved

    async findAll(): Promise<Partial<IDMaterial>[]> {
      return this.materialModel
        .find({is_admin_approved: true})
        .then(data => data.map(item => _.omit(item.toObject(), 'is_admin_approved')));
    }
    

    您还可以在IDMaterial dto 类中将is_admin_approved 标记为@Exclude,然后将检索到的项目转换为该dto (plainToClass(IDMaterial, item))。

    export class IDMaterial {
       // ...
       @Exclude()
       is_admin_approved: boolean;
      // ...
    }
    
    // ...
    async findAll(): Promise<Partial<IDMaterial>[]> {
      return this.materialModel
        .find({is_admin_approved: true})
        .then(data => data.map(item => plainToClass(IDMaterial, item)));
    
    }
    

    【讨论】:

    • src/feature/material/material.service.ts(13,7): error TS2322: Type 'IDMaterial[] | { _id:任何;材料名称:字符串; }[]' 不可分配给类型 'IDMaterial[]'。 [2] 输入'{_id:any;材料名称:字符串; }[]' 不可分配给类型 'IDMaterial[]'。 [2] 输入'{_id:any;材料名称:字符串; }' 缺少类型“IDMaterial”中的以下属性:material_status、is_admin_approved、increment、model 等 54 个。
    • IDMaterial 中将is_admin_approved 标记为可选(is_admin_approved?) 或使用Promise&lt;Partial&lt;IDMaterial&gt;[]&gt; 作为findAll 方法的返回值。
    • 我还在IDMaterial实体中看到了很多其他字段,而不仅仅是"_id", "m_name", "is_admin_approved"。因此,您可以省略 is_admin_approved 而不是重新映射所有其他字段。我会更新答案
    • src/feature/material/material.service.ts(16,18):错误 TS2704:删除运算符的操作数不能是只读属性。 --- 这是新错误
    猜你喜欢
    • 2021-12-14
    • 2021-02-13
    • 2020-01-27
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 2016-12-21
    • 2018-07-24
    相关资源
    最近更新 更多