【问题标题】:Why doesn't Accounts.createUser create a user in MongoDB?为什么 Accounts.createUser 不在 MongoDB 中创建用户?
【发布时间】:2016-12-24 06:46:36
【问题描述】:

我正在使用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;

我不知道为什么必须创建一个新集合才能使其正常工作。 accounts-password 包不应该自己创建一个集合吗?

【问题讨论】:

  • 您是否在调用Accounts.createUser 之前记录了您的emailpassword 值,以确保它们具有有效值?
  • 是的。它们具有有效值。我证实了这一点。此外,当我将 Accounts.users 设置为 mongo 集合时,也会出现这些条目。

标签: mongodb meteor meteor-accounts


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您是否添加了accounts-base 包? Accounts.createUser 来自这个包。 (docs)

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

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

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

    【讨论】:

      【解决方案3】:

      _driver: dbConn

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

      你写的代码没有问题,不是你的问题。 Accounts.createUser 是正确的调用方法。

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

      【讨论】:

        猜你喜欢
        • 2020-03-22
        • 1970-01-01
        • 2019-03-10
        • 2021-03-18
        • 1970-01-01
        • 2016-11-16
        • 1970-01-01
        • 1970-01-01
        • 2019-04-15
        相关资源
        最近更新 更多