首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套中的“排除”未按预期工作

嵌套中的“排除”未按预期工作
EN

Stack Overflow用户
提问于 2021-05-25 08:56:36
回答 1查看 241关注 0票数 1

我想在用户架构中排除密码字段。但我搞不懂。

UserSchema.ts

代码语言:javascript
复制
export type UserDocument = User & Document;

@Schema()
export class User extends BaseSchema {

    @Prop({ type: String })
    firstName: string;

    @Prop({ type: String })
    lastName: string;

    @Prop({ type: String, required: true, unique: true })
    email: string;

    @Prop({ type: String })
    phone: string;

    @Prop({ type: String, required: true, unique: true })
    userName: string;

    @Exclude()
    @Prop({ type: String, required: true })
    password: string;

    @Prop({ type: String })
    avatar: string;

}

export const UserSchema = SchemaFactory.createForClass(User);

UserController.ts

代码语言:javascript
复制
@UseInterceptors(ClassSerializerInterceptor)
    @Get(':id')
    public async getUserById(@Param('id') id: string): Promise<ResponseDto> {
        try {
            const result = await this.userService.getOne({ _id: id });
            return new ResponseDto({
                isSuccess: true,
                message: 'ok',
                data: result
            });

        } catch (error) {
            return new ResponseDto({
                isSuccess: false,
                message: error,
                data: null
            });
        }
    }

我是UserService.ts

代码语言:javascript
复制
@Injectable()
export class UserService {

    constructor(
        @InjectModel('User') private readonly userModel: Model<UserDocument>
    ) { }

    public async getMany(query: object): Promise<User[]> {
        const users: User[] = await this.userModel.find(query).exec();
        return users;

    }


    public async getOne(query: object): Promise<User> {
        const user = await this.userModel.findOne(query).exec();
        return user;
    }


    public async deleteOne(query: object): Promise<any> {
        const result = await this.userModel.deleteOne(query).exec();
        if (result.n === 0) {
            throw new HttpException('Not deleted', 400);
        }
        return result;
    }

    public async deleteMany(query: object): Promise<any> {
        const result = await this.userModel.deleteMany(query).exec();
        if (result.n === 0) {
            throw new HttpException('Not deleted', 400);
        }
        return result;
    }

    public async updateOne(query: object, user: UserUpdateDto): Promise<User> {
        return await this.userModel.findOneAndUpdate(query, user).exec();
    }

    public async updateMany(query: object, user: UserUpdateDto): Promise<any> {
        return await this.userModel.updateMany(query, user).exec();
    }


    public async add(newUser: UserCreateDto): Promise<User> {
        const user = await new this.userModel(newUser);
        return await user.save();
    }

    public async addRange(newUsers: UserCreateDto[]): Promise<any> {
        return await this.userModel.collection.insertMany(newUsers);
    }

}

昂首阔步的结果是:

代码语言:javascript
复制
{
  "$__": {
    "strictMode": true,
    "selected": {},
    "getters": {},
    "_id": {
      "_bsontype": "ObjectID",
      "id": {
        "type": "Buffer",
        "data": [
          96,
          171,
          150,
          114,
          131,
          27,
          120,
          44,
          172,
          51,
          211,
          88
        ]
      }
    },
    "wasPopulated": false,
    "activePaths": {
      "paths": {
        "email": "init",
        "userName": "init",
        "password": "init",
        "_id": "init",
        "firstName": "init",
        "lastName": "init",
        "phone": "init",
        "avatar": "init",
        "__v": "init"
      },
      "states": {
        "ignore": {},
        "default": {},
        "init": {
          "_id": true,
          "firstName": true,
          "lastName": true,
          "email": true,
          "phone": true,
          "userName": true,
          "password": true,
          "avatar": true,
          "__v": true
        },
        "modify": {},
        "require": {}
      },
      "stateNames": [
        "require",
        "modify",
        "init",
        "default",
        "ignore"
      ]
    },
    "pathsToScopes": {},
    "cachedRequired": {},
    "$setCalled": [],
    "emitter": {
      "_events": {},
      "_eventsCount": 0,
      "_maxListeners": 0
    },
    "$options": {
      "skipId": true,
      "isNew": false,
      "willInit": true,
      "defaults": true
    }
  },
  "isNew": false,
  "$locals": {},
  "$op": null,
  "_doc": {
    "_id": {
      "_bsontype": "ObjectID",
      "id": {
        "type": "Buffer",
        "data": [
          96,
          171,
          150,
          114,
          131,
          27,
          120,
          44,
          172,
          51,
          211,
          88
        ]
      }
    },
    "firstName": "",
    "lastName": "",
    "email": "ali@gel.com",
    "phone": "",
    "userName": "ali@gel.com",
    "password": "$2b$10$Vp9EYM8fuid.bu2cisp45.QPHdQyPLLlcFeOTPUS98AzUxx3WTekG",
    "avatar": "",
    "__v": 0
  },
  "$init": true
}

有两个问题我无法处理: 1-密码字段仍在响应中。我想排除它2-响应对象不干净。有许多领域我不想得到。

我预期的回应是:

代码语言:javascript
复制
{ 
isSuccess: true,
message:'ok',
  data: {
    "firstName": "",
    "lastName": "",
    "email": "ali@gel.com",
    "phone": "",
    "userName": "ali@gel.com",
    "avatar": ""
  }
}
EN

回答 1

Stack Overflow用户

发布于 2022-01-16 10:23:55

您可以使用另一个套餐并使用@ExcludeProperty()

代码语言:javascript
复制
@UseInterceptors(new SanitizeMongooseModelInterceptor())
@Get(':id')
public async getUserById(@Param('id') id: string): Promise<ResponseDto> {
   ...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67684782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档