node.js - 类型错误 : Cannot read property '0' of undefined passport-facebook

标签 node.js facebook facebook-graph-api express passport-facebook

每当我尝试使用 Facebook 登录时,它都会返回此错误,我已按照此链接建议进行操作,但仍然没有成功。 Passport-facebook doesn't get email

newUser.facebook.email = profile.emails[0].value;
                                           ^
TypeError: Cannot read property '0' of undefined    

这是代码

var passport = require('passport');
var FacebookStrategy = require('passport-facebook').Strategy;
var User = require('../models/user');

var facebookConfig = {
  clientID: 'ID',
  clientSecret: 'SECRET',
  callbackURL: 'http://localhost:8080/facebook/callback'
};

var facebookInit = function(token, refreshToken, profile, callback) {
  User.findOne({ "facebook.id": profile.id }, function(err, user) {
    if (err) return callback(err);

    if (user) {
      return callback(null, user);
    }

    var newUser = new User();
    newUser.facebook.id = profile.id;
    newUser.facebook.token = token;
    newUser.facebook.email = profile.emails[0].value;
    newUser.facebook.displayName = profile.displayName;
    newUser.facebook.photo = profile.photos[0].value

    newUser.save(function(err) {
      if (err) {
        throw err;
      }
      return callback(null, newUser);
    });
  });
}

passport.use(new FacebookStrategy(facebookConfig, facebookInit));

passport.serializeUser(function(user, callback) {
  callback(null, user.id)
});

passport.deserializeUser(function(id, callback) {
  User.findById(id, function(err, user) {
    callback(err, user);
  });
});

module.exports = {
  facebookLogin: passport.authenticate("facebook",  { scope: ['email'] }),
  facebookCallback: passport.authenticate("facebook", {
    successRedirect: "/profile",
    failureRedirect: "/"
  })
}

我尝试将范围从 {scope: 'email' } 更改为 {scope: ['email'] },但仍然没有成功。

最佳答案

您是否尝试在配置中明确指定电子邮件字段?在你的情况下它应该是:

var facebookConfig = {
  clientID: 'ID',
  clientSecret: 'SECRET',
  callbackURL: 'http://localhost:8080/facebook/callback',
  profileFields: ['id', 'email', 'gender']
};

注意profileFields,好像是APIv2.4要求的。 这应该有帮助。

关于node.js - 类型错误 : Cannot read property '0' of undefined passport-facebook,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32313872/

相关文章:

javascript - 将 eventListener 或 attachEvent 添加到 Electron 中的 anchor 标记的正确方法是什么?

sql - 模型关联 getter 中的预加载

php - 无法获取 AdCreative ObjectStorySpec

php - 一些 Facebook 用户的数据未插入 mysql 数据库

javascript - 通过 facebook id 获取登录用户的可标记 id

Facebook Graph API - 寻找用户的顶级 friend

node.js - Mongoose + Typescript -> 导出模型接口(interface)

javascript - 服务器和客户端在 socket.io node.js 上的两种通信方式

ios - 使用 Facebook 电子邮件登录未返回

javascript - 主屏幕网络应用程序的 Facebook 身份验证已损坏!+