在passpost.js中使用Facebook策略时 - 用户不会返回

时间:2016-05-09 06:35:53

标签: node.js express passport.js

我坚持这个并且不确定如何继续。

我在节点上使用 passport.js 并使用快递进行身份验证,并使用 Facebook策略

传统上,当您在数据库中保存用户时,您只需执行findOne以查看用户是否存在并返回用户,如果不存在,则创建新用户并返回该用户。对我来说,我正在使用API​​路由进行实际保存,那么一旦用户使用API​​保存而不是在实际功能中,我将如何返回用户?

以下代码:

passport.use(new FacebookStrategy({
    clientID: config.facebook.appID,
    clientSecret: config.facebook.appSecret,
    callbackURL: config.facebook.callbackURL,
    profileFields: ['id', 'displayName', 'photos', 'emails', 'birthday', 'location', 'bio', 'likes.limit(100)']
},
function(accessToken, refreshToken, profile, done){
    userModel.findOne({'profileID':profile.id}, function(err, user){
        if(user){
            done(null, user);
        } else {
            request({
                url: 'http://localhost:3000/api/user',
                qs: {id:  profile.id},
                method: 'POST',
                json: {
                    fullname:   profile.displayName,
                    profilePic: profile.photos[0].value || '',
                    email:      profile.emails[0].value || '',
                    birthday:   profile._json.birthday || '',
                    location:   profile._json.location.name || '',
                    about:      profile._json.bio || '',
                    likes:      profile._json.likes || ''
                }
            });

            //What do I put here to return the user like it did earlier using done(null, user);
    }}
    )
}
)
)

我的路线看起来像这样(但是我无法使上面的功能返回它,因为我通过路由到API来做它):

apiRouter.post('/api/user', function(req, res, next){
    userModel.findOne({'profileID':req.query.id}, function(err, result){
        if(result){
            console.log('User exists already');
        } else {
            var newUser = new userModel({
                profileID   :   req.query.id,
                fullname    :   req.body.displayName,
                profilePic  :   req.body.profilePic || '',
                email       :   req.body.email || '',
                birthday    :   req.body.birthday || '',
                location    :   req.body.location || '',
                about       :   req.body.about || '',
                likes       :   req.body.likes || ''
            });

            newUser.save(function(err){
                console.log('User has been saved');
            })
        }
    })
})

顺便说一句,直接保存在函数中的用户可以工作,但我希望我的核心工作由API端完成(POST调用)。

您的意见将受到高度赞赏。

谢谢, 砂眼

1 个答案:

答案 0 :(得分:1)

您不希望从内部应用向内部应用发出http请求。 API(路由等)确实设计为供其他应用程序使用。由于所有逻辑都在你的应用程序中,而不是制作公共路由器,你需要将“findOrCreate”代码移动到它自己的模块/文件中,这样你就可以无缝地从两个地方调用它。

如果您的findOrCreate返回了一个承诺,那么您的护照代码可以执行以下操作:

function(accessToken, refreshToken, profile, done){
  userModel.findOrCreate(profile).then(function(user) {
    done(user);
  });
}

如果您稍后需要一个路径供浏览器JS访问,您的路由代码可能如下所示:

function(req, res, next){
  userModel.findOrCreate(profile).then(function(user) {
    res.send(user);
  });
}