gpt4 book ai didi

Node.js:数据库条目的白名单/编辑

转载 作者:可可西里 更新时间:2023-11-01 09:40:42 26 4
gpt4 key购买 nike

从 Node ,我访问一个数据库,对象如下

animals: [
{
name: monkey,
diet: banana,
tame: false,
},
{
name: donkey,
diet: carrot,
tame: true,
}
// [...]
]

我想将大部分数据的访问权限授予客户端,但要确保 tame 属性暴露。

使用 Node 和 lodash's pick() ,我可以以某种方式将数据列入白名单,例如,

// retrieve data
// [...]

// whitelist
return {
name: _.pick(animal, 'name'),
diet: _.pick(animal, 'diet'),
};

但这有点乏味,特别是如果 key 的选择取决于其他因素(例如,试图访问数据的用户)。

什么是好的白名单/redaction Node 的模式/模块?

最佳答案

这在很大程度上取决于您使用的数据库。大多数数据库只允许您在查询本身中选择特定的列/字段。 MongoDB 也这样做。

如果您使用 mongoose,您实际上可以为每个模型强制执行此操作:

function filter(document, animal) {
delete animal.tame;
return animal;
};

var options = {
toJSON: {transform: filter},
toObject: {transform: filter}
};

var animalSchema = new Schema({
name: { type: String, trim: true, required: true },
tame: { type: boolean, required: true },
secret: { type: String, required: true, select: false }
},options);


var Animal = mongoose.model('Animal', animalSchema);

var dog = new Animal({name:"rex", tame:true, secret:"rexrex"});

dog.save();

dog.toJSON(); // will not have "tame" property
dog.toJSON({transform: filter}) // dynamic filter

dog.toObject(); // will not have "tame" property

Animal.findOne(); // result objects will not have "secret" property

如您所见,您可以:

  1. 设置一个转换函数以在导出为 json 或对象时在文档上执行。
  2. select:false 标记一个字段,它不会出现在任何基于 mongoose 模型的查询中。 (不过您仍然可以执行自定义查询。)

如果您正在处理大量对象,请考虑编写 Transform Stream .然后你可以:

Animal.find().stream().pipe(myTransformStream).pipe(clientResponse) 

关于Node.js:数据库条目的白名单/编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34396591/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com