Javascript 如何向用户文档(不在配置文件中)添加其他字段?
我知道向用户集合添加数据的经典方法是Javascript 如何向用户文档(不在配置文件中)添加其他字段?,javascript,meteor,meteor-accounts,Javascript,Meteor,Meteor Accounts,我知道向用户集合添加数据的经典方法是profilearray,但据我所知,这并不是存储数据的最佳方法 是否有替代方法,例如在用户集合的根目录中创建一个与默认字段相同级别的字段(\u id,用户名,等等)?您可以通过该函数向用户文档添加额外字段 例如: if (Meteor.isServer) { Accounts.onCreateUser(function(options, user) { _.extend(user, { myValue: "va
profile
array,但据我所知,这并不是存储数据的最佳方法
是否有替代方法,例如在用户集合的根目录中创建一个与默认字段相同级别的字段(
\u id
,用户名
,等等)?您可以通过该函数向用户文档添加额外字段
例如:
if (Meteor.isServer) {
Accounts.onCreateUser(function(options, user) {
_.extend(user, {
myValue: "value",
myArray: [],
myObject: {
key: "value"
}
});
});
}
请注意:默认情况下,以下字段将发布到客户端用户名
、电子邮件
和个人资料
。因此,您需要发布任何其他字段
例如:
if (Meteor.isServer) {
Meteor.publish("user", function() {
if (this.userId) return Meteor.users.find({
_id: this.userId
}, {
fields: {
'myValue': 1,
'myArray': 1,
'myObject': 1
}
});
else this.ready();
});
}
if (Meteor.isClient) {
Meteor.subscribe("user");
}
profile
字段本身没有什么错误,只是用户可以(当前)在默认情况下直接更新自己的配置文件
我认为这种行为并不可取,因为用户可以在配置文件中存储任意数据
如果开发人员将该字段用作权限来源,则这可能成为真正的安全风险;例如,在其中存储用户的组或角色
在这种情况下,用户可以设置自己的权限和角色
这是由于:
users.allow({
//客户可以修改自己文档的配置文件字段,以及
//没有别的了。
更新:函数(用户ID、用户、字段、修饰符){
//确保这是我们的记录
if(用户。\u id!==用户id)
返回false;
//用户只能修改“配置文件”字段。设置为多个
//子键(例如profile.foo和profile.bar)合并到条目中
//在字段列表中。
if(fields.length!==1 | | fields[0]!=='profile')
返回false;
返回true;
}
});
首先要做的是限制对它的写入:
Meteor.users.deny({
更新(){
返回true;
}
});
然后可以使用方法和其他授权代码对其进行更新
如果添加自己的字段并希望将其发布到当前登录的用户,可以使用自动发布:
Meteor.publish(null,函数(){
if(this.userId){
返回Meteor.users.find({
_id:this.userId
}, {
字段:{
你的客户字段1:1,
yourCustomField2:1
}
});
}否则{
返回这个.ready();
}
});
Meteor.users
只是一个普通的Mongo.Collection
,所以修改它就像修改任何其他集合一样。还有一个创建钩子,Accounts.onCreateUser
,它允许您在用户对象首次创建时将自定义数据添加到用户对象中,如@MatthiasEckhart的回答中所述。是的,您可以创建自定义字段并按需发布,或者禁止免费编辑配置文件字段(无论如何推荐)。感谢MasterAM,您能否提供有关如何创建自定义字段的更多详细信息?感谢您的澄清。此aproch适用于user.profile.myValue,但不适用于user.myValue,或者是我缺少的其他内容?此方法在根级别向用户文档添加了其他字段。你能分享一个吗?“我得到”内部服务器错误“。你需要返回(修改过的)用户文档。这是更新的。我在复制到MeteoPad时的错误,重点是新字段没有出现在DB中,我将打印屏幕(蒙古文)放在这里,更清楚地说:与我在claud主机上得到的效果相同。