登录并在Meteor中注册Facebook时出现问题

时间:2016-04-28 11:46:36

标签: javascript facebook meteor meteor-accounts

我正在尝试使用Facebook连接并注册到我的Meteor.js应用程序中。在我的登录模板中,我放了一个按钮来执行此操作。我调用函数Meteor.loginWithFacebook()但它不起作用...我猜测Meteor尝试创建一个新用户,但它找不到用户名信息,但我不知道如何管理

我打电话给登录的处理程序:

'click #facebook-login': function(event) {
    Meteor.loginWithFacebook({}, function(err){
        if (err) {
            throw new Meteor.Error("Facebook login failed");
            Materialize.toast('Echec de connexion!', 4000);
        }
        else {
            Router.go(Utils.pathFor('home'));
            Materialize.toast('Bon retour parmis nous ' + Meteor.user().username + ' !', 5000);
        }
    });
}

我遇到的错误:

I20160428-12:44:56.099(2)? Exception while invoking method 'login' Error: Nom d'utilisateur is required
I20160428-12:44:56.100(2)?     at getErrorObject (packages/aldeed_collection2-core/lib/collection2.js:437:1)
I20160428-12:44:56.101(2)?     at [object Object].doValidate (packages/aldeed_collection2-core/lib/collection2.js:420:1)
I20160428-12:44:56.101(2)?     at [object Object].Mongo.Collection.    (anonymous function) [as insert] (packages/aldeed_collection2-core/lib/collection2.js:173:1)
I20160428-12:44:56.101(2)?     at AccountsServer.Ap.insertUserDoc (packages/accounts-base/accounts_server.js:1250:25)
I20160428-12:44:56.101(2)?     at AccountsServer.Ap.updateOrCreateUserFromExternalService (packages/accounts-base/accounts_server.js:1386:20)
I20160428-12:44:56.102(2)?     at [object Object].Package (packages/accounts-oauth/oauth_server.js:55:1)
I20160428-12:44:56.103(2)?     at packages/accounts-base/accounts_server.js:464:32
I20160428-12:44:56.103(2)?     at tryLoginMethod (packages/accounts-base/accounts_server.js:241:14)
I20160428-12:44:56.103(2)?     at AccountsServer.Ap._runLoginHandlers (packages/accounts-base/accounts_server.js:461:18)
I20160428-12:44:56.103(2)?     at [object Object].methods.login (packages/accounts-base/accounts_server.js:524:27)
I20160428-12:44:56.129(2)? Sanitized and reported to the client as: Nom d'utilisateur is required [400]

用户架构:

Globals.schemas.UserProfile = new SimpleSchema({
firstName: {
    type: String,
    regEx: /^[a-zA-Z-]{2,25}/,
    optional: true,
    label: "Prénom"
},
lastName: {
    type: String,
    regEx: /^[a-zA-Z-]{2,25}/,
    optional: true,
    label: "Nom"
},
birthDay: {
    type: Date,
    optional: true,
    label: "Date de naissance",
    min: new Date("1900-01-01T00:00:00.000Z"),
    autoform: {
        value: new Date("1900-10-18T00:00:00.000Z")
    }
},
gender: {
    type: String,
    allowedValues: ['M', 'F'],
    optional: true,
    label: "Genre",
    autoform: {
        options: [
            {
                label: "Homme",
                value: "M"
            },
            {
                label: "Femme",
                value: "F"
            }
        ],
        firstOption: "(Veuillez sélectionner une réponse)"
    }
},
level: {
    type: Number,
    autoValue: function () {
        if (this.isInsert) {
            return 1;
        }
    },
    autoform: {
        omit: true
    },
    min: 0,
    max: 1000,
    label: "Niveau"
},
picture: {
    type: String,
    optional: true,
    autoform: {
        omit: true
    },
    label: "Photo"
}
});

// Schéma principal
Globals.schemas.User = new SimpleSchema({
username: {
    type: String,
    regEx: /^[a-z0-9A-Z_]{3,30}$/,
    label: "Nom d'utilisateur"
},
password: {
    type: String,
    label: "Mot de passe",
    optional: true,
    autoform: {
        afFieldInput: {
            type: "password"
        }
    }
},
confirmation: {
    type: String,
    label: "Confirmation",
    optional: true,
    custom: function(){
        if(this.value !== this.field('password').value){
            return "passwordMissmatch";
        }
    },
    autoform: {
        afFieldInput: {
            type: "password"
        }
    }
},
emails: {
    type: [Object],
    optional: false,
    label: "Adresses Email"
},
"emails.$.address": {
    type: String,
    regEx: SimpleSchema.RegEx.Email,
    label: "Adresses Email"
},
"emails.$.verified": {
    type: Boolean,
    optional: true,
    autoform: {
        omit: true
    }
},
createdAt: {
    type: Date,
    autoValue: function () {
        if (this.isInsert) {
            return new Date;
        } else {
            this.unset();
        }
    },
    autoform: {
        omit: true
    }
},
profile: {
    type: Globals.schemas.UserProfile,
    optional: true
},
services: {
    type: Object,
    optional: true,
    blackbox: true,
    autoform:{
        omit: true
    }
},
roles: {
    type: Object,
    optional: true,
    blackbox: true,
    autoform: {
        omit: true
    }
}
});

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

问题是您的架构要求Meteor.users有一个username字段,默认情况下它们不包含这个字段。但是,您可以通过从Facebook个人资料中获取其姓名来生成此字段。

Accounts.onCreateUser(function(options, user) {
  user.username = user.services.facebook.name;
  return user;
});

http://docs.meteor.com/#/full/accounts_oncreateuser