在猫鼬查找操作中屏蔽数据



要求是屏蔽手机号码并仅显示最后4位数字。我不希望在客户端执行此操作,而是在发送响应之前对其进行屏蔽。我不确定如何修改事务对象以屏蔽数据。我想检查是否有任何猫鼬函数可以执行此操作。如果没有,请向我建议屏蔽所选字段的最佳方法。

获取事务的逻辑

Transaction.find(query).populate('from','name mobile email').sort({ createdAt : -1 }).skip((page) * limit).limit(limit).exec((err, transaction) =>{
if(transaction){
Transaction.countDocuments({to:id,paymentStatus:"SUCCESS"},function(err,count){
return res.status(200).send({transaction,count:count});
});
}
else if(transaction==null) return res.status(200).send("No Transactions Found");
else if(err) return res.status(400).send("Error Occurred");
});

User.Model.ts - 商家模型与一些附加字段类似

var User= new mongoose.Schema({
email:{type:String,required:"E-Mail address cannot be empty",unique:true},
mobile:{type:String,required:"Mobile number cannot be empty",min : [10,"Please provide a valid 10 digit mobile number"],unique:true},
password:{type:String,required:"Password cannot be empty",minlength : [4,"Password must be more than 4 characters"]},
.......some unrelated fields...
});

Transaction.Model.ts

var transactionSchema = new mongoose.Schema({
from:{ type: mongoose.Schema.Types.ObjectId, required: true, ref: 'User' },
amount : {type:String,required:true},
to:{ type: mongoose.Schema.Types.ObjectId, required: true, ref: 'Merchant'  },
paymentStatus:{type : String, default : "INCOMPLETE"},
.......some unrelated fields...
});

电流输出

{"transaction":[{"paymentStatus":"SUCCESS","isDisputed":true,"_id":"5eb8e50b3e2adb3b74e85d4f","from":{"_id":"5eb8e50a3e2adb3b74e85d43","name":"John Doe","email":"test@gmail.com","mobile":"9999999999"},"amount":"40","to":"5eb8e50a3e2adb3b74e85d46"}],"count":1}

预期产出

{"transaction":[{"paymentStatus":"SUCCESS","isDisputed":true,"_id":"5eb8e50b3e2adb3b74e85d4f","from":{"_id":"5eb8e50a3e2adb3b74e85d43","name":"John Doe","email":"test@gmail.com","mobile":"*******999"},"amount":"40","to":"5eb8e50a3e2adb3b74e85d46"}],"count":1}

您可以在获取字段后使用字符串掩码来屏蔽字段。 猫鼬插件、虚拟或 getter 也会让你迭代数组,所以最终结果是相同的。

let stringMasking = require('string-masking');
...
transactions = transactions.map(transaction => {
let mask = stringMasking(transaction.from.phone, 0);
transaction.from.phone = mask.response;
return transaction;
});
...
return res.status(200).send({transaction,count:transaction.length});

此外,如果不需要,最好使密码不包含在所有查找查询中。可以通过以下方式完成:

password: {type: String,select: false}

最新更新