node.js - 当电子邮件存在时显示来自 Facebook 策略的连接闪现消息

标签 node.js passport.js passport-facebook connect-flash

当我测试数据库中是否已存在与 Passport Facebook 策略关联的电子邮件地址时,我尝试显示错误消息。

这是我的代码:

// callback route for facebook to redirect to
router.get('/facebook/redirect', passport.authenticate('facebook'), (req, res) => {
    res.redirect('/profile/');
});

// Facebook Strategy
passport.use(
    new FacebookStrategy({
        clientID: keys.facebook.clientID,
        clientSecret: keys.facebook.clientSecret,
        callbackURL: '/auth/facebook/redirect',
        profileFields: ['id', 'email', 'displayName', 'photos']
    }, (err, accessToken, refreshToken, profile, done) => {
        User.findOne({ email: profile.emails[0].value }).then((response) => {
            if(response) {
                console.log('Email already exists.'); // This is where I get my response
            } else {
                User.findOne({
                    facebookID: profile.id
                }).then((currentUser) => {
                    if(currentUser) {
                        done(null, currentUser);
                    } else {
                        new User({
                            name: profile.displayName,
                            username: profile.displayName + ' Facebook',
                            facebookID: profile.id,
                            email: profile.emails[0].value,
                            avatar: profile.photos ? profile.photos[0].value : '/img/faces/unknown-user-pic.jpg'
                        }).save().then((newUser) => {
                            done(null, newUser);
                        });
                    }
                })
            }
        })
    })
);

如果电子邮件已存在,如何在登录页面上向用户显示错误提示消息?

最佳答案

我已经找到解决办法了。我向我的 Facebook 回调添加了失败重定向:

// callback route for facebook to redirect to
router.get('/facebook/redirect', passport.authenticate('facebook', {
    successRedirect: '/profile/',
    failureRedirect: '/auth/login', 
    failureFlash: true
}), (req, res) => {
res.redirect('/profile/');
});

然后返回null、false以及要显示的错误信息:

passport.use(
    new FacebookStrategy({
        clientID: keys.facebook.clientID,
        clientSecret: keys.facebook.clientSecret,
        callbackURL: '/auth/facebook/redirect',
        profileFields: ['id', 'email', 'displayName', 'picture.type(large)']
    }, (err, accessToken, refreshToken, profile, done) => {
        User.findOne({
            facebookID: profile.id
        }).then((currentUser) => {
            if (currentUser) {
                done(null, currentUser);
            } else {
                User.findOne({ email: profile.emails[0].value }).then((response) => {
                    if (response) {
                        done(null, false, {message: "Email already exists"}); // <-- Where I return the callback
                    } else {
                        new User({
                            name: profile.displayName,
                            username: profile.displayName + ' Facebook',
                            facebookID: profile.id,
                            email: profile.emails[0].value,
                            avatar: profile.photos ? profile.photos[0].value : '/img/faces/unknown-user-pic.jpg'
                        }).save().then((newUser) => {
                            done(null, newUser);
                        });
                    }
                })
            }
        })
    })
);

我希望这可以帮助其他遇到同样问题的人:)

关于node.js - 当电子邮件存在时显示来自 Facebook 策略的连接闪现消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49288834/

相关文章:

node.js - 使用 Node.JS 将一个函数的值返回到另一个函数

node.js - 在nodejs和meteor之间共享mongodb

javascript - 使用 Passport.js facebook 策略进行身份验证后如何使用 Facebook Graph API?

javascript - Passport facebook 策略 throw 数据必须是使用 Node.js 的字符串

javascript - 循环Json,搜索相同的键结尾,删除键结尾并将其放入新对象中

node.js - 安装 Node 模块 xml-stream

node.js - Node 中持久的cookie

node.js - Passport-Local Mongoose - 更改密码?

node.js - Passport Facebook 身份验证未提供电子邮件地址

facebook - 如何在nestjs facebook策略回调url中传递动态参数