Получить виртуальное поле из защищенного, а не выбранного поля - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть поле телефона в моем пользователе. дело в том, что я не могу отправить его на фронт (охрана и все). Поэтому я хотел создать виртуальное поле, чтобы узнать, дал ли этот пользователь свой телефон.

Здесь схема:

const userSchema = new Schema({
    phone: { type: String}
},{
    toObject: {virtuals: true },
    toJSON: {virtuals: true }
});

Здесь виртуальная:

userSchema.virtual('hasPhone')
    .get(function () {
        return Boolean(this.phone);
    })

И яиметь это, чтобы выбрать поля:

const publicFields = ['-phone'];

userSchema.statics.publicOnly = function (queryObject) {
    return queryObject.select(publicFields);
}

И использовать это так:

getUserById(userId, all = false) {
    const query = User.findById(userId);

    return (!all ? User.publicOnly(query) : query).exec();
}

Если я отправлю в нем все = true, я получу телефон.

Итак, в моем выборе я исключаю телефон, но в этом случае у виртуального больше нет телефона, и он не может работать.

Моя цель - иметь hasPhone, но при этом защищать телефон

Спасибоза помощь

1 Ответ

0 голосов
/ 08 ноября 2019

Запрос с телефоном и использование toObject() для преобразования документа в объект JS. Затем удалите телефон, поданный с объекта. Затем верните объект клиенту.

Пример:

const users = await userSchema.find({});
const usersObj = users.toObject();
usersObj.forEach(doc => {
  doc.phone = undefined;
})
res.end(usersObj);
...