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主机上得到的效果相同。