Node.js 从受保护而非选定字段获取虚拟字段

Node.js 从受保护而非选定字段获取虚拟字段,node.js,mongoose,mongoose-schema,Node.js,Mongoose,Mongoose Schema,我的用户中有一个电话字段。问题是我不能把它发到前线(安全部门和所有部门)。所以我想做一个虚拟的字段来知道这个用户是否给了他的手机 此处为模式: const userSchema=新模式({ 电话:{type:String} },{ toObject:{virtuals:true}, toJSON:{virtuals:true} }); 此处虚拟: userSchema.virtual('hasPhone') .get(函数(){ 返回布尔值(this.phone); }) 我用这个来选择字段

我的用户中有一个电话字段。问题是我不能把它发到前线(安全部门和所有部门)。所以我想做一个虚拟的字段来知道这个用户是否给了他的手机

此处为模式:

const userSchema=新模式({
电话:{type:String}
},{
toObject:{virtuals:true},
toJSON:{virtuals:true}
});
此处虚拟:

userSchema.virtual('hasPhone')
.get(函数(){
返回布尔值(this.phone);
})
我用这个来选择字段:

constpublicfields=['-phone'];
userSchema.statics.publicOnly=函数(queryObject){
返回queryObject.select(publicFields);
}
并像这样使用它:

getUserById(userId,all=false){
const query=User.findById(userId);
返回(!all?User.publicOnly(查询):query.exec();
}
如果我在里面发送all=true,我就会得到电话

所以,在我的选择中,我排除了电话,但在这种情况下,虚拟机不再有电话,无法工作

我的目标是在保护手机的同时拥有hasPhone


感谢您的帮助

通过电话查询并使用
toObject()
将文档转换为JS对象。然后从对象中删除电话文件。然后将对象返回给客户机

例如:

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

事实上,我两者都需要,有电话和没有电话。我编辑了我的问题以显示如何访问它。所以我不能用你的答案,因为我不能选择我想要的。