为什么Accounts.createUser不在MongoDB中创建用户?

时间:2016-08-17 14:31:52

标签: mongodb meteor meteor-accounts

我正在使用accounts-password包来管理我的用户帐户。我尝试了两种使用Accounts.createUser()函数创建帐户的方法。

第一种方式:从客户端调用Accounts.createUser()

register.js:

Template.register.events({
    "submit form"(event){
        event.preventDefault();

        const email = event.target.email.value;
        const password = event.target.password.value;

        Accounts.createUser({
            email: email,
            password: password
        });
    }
});

第二种方式:从服务器方法调用Accounts.createUser()并从客户端调用方法。完成后得到提示:Meteor: Accounts.createUser() doesn't create user

register.js:

Template.register.events({
    "submit form"(event){
        event.preventDefault();

        const email = event.target.email.value;
        const password = event.target.password.value;

        Meteor.call('createNewUser', email, password);
    }
});

methods.js:(在服务器上)

Meteor.methods({
    'createNewUser'(email, password){
        Accounts.createUser({
            email: email,
            password: password
        });
    }
});

在这两种情况下,MongoDB中都没有创建新的集合。任何旧的集合都没有更新。我的连接字符串是正确的。为什么会这样?

但是,当我在服务器上使用以下内容时,会创建一个文档:

Accounts.users = new Mongo.Collection("profiles", {
    _preventAutopublish: true, _driver: dbConn
});

Meteor.users = Accounts.users;

我不知道为什么必须为此创建新的集合才能工作。是不是帐户密码包应该自己创建一个集合?

3 个答案:

答案 0 :(得分:0)

如果您只是希望启动并运行基本版本,请尝试将默认的{{> loginButtons}}添加到您的html中。这也将确保javascript按原样执行。手动构建js只有在需要更多可自定义性时才有意义。

答案 1 :(得分:0)

您是否添加了accounts-base包裹? Accounts.createUser来自此软件包。 (docs)

在您提供的关联示例中,OP在forbidClientAccountCreation: true中设置了Accounts.config()。这会阻止Accounts.createUser函数在客户端上工作(这在用户需要注册邀请的应用程序中很有用)。这就是建议用于创建用户帐户服务器端并且不适用于您的应用程序的答案的原因。

作为旁注,在第二个示例中,您将未加密的密码从客户端传递到服务器,这被视为危险。 您可以在将其发送到服务器方法之前加密它,如下所示:

const password = Accounts._hashPassword( event.target.password.value );

答案 2 :(得分:0)

  

_driver: dbConn

那条线真的很令人担忧。您是否尝试管理自己的数据库连接?

您编写的代码没有任何问题,这不是您的问题。 Accounts.createUser是正确的调用方式。

如果您需要使用与通过终端运行meteor命令而默认初始化的数据库不同的数据库,请查看有关使用MONGO_URL的文档。