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

When using Facebook strategy in passpost.js - user doesn't get returned

我一直卡在这个问题上,不确定如何进行。

我在 nodeexpress 上使用 passport.js 进行身份验证并且正在使用 Facebook 策略

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

代码如下:

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);
    }}
    )
}
)
)

我的路线看起来像这样(可行,但我无法将上面的功能设置为 return,因为我正在通过路由到 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 调用)。

非常感谢您的意见。

谢谢, 沙燕

您不会希望从您的内部应用程序向您的内部应用程序发出 http 请求。 API(路由等)实际上是为其他应用程序使用而设计的。由于所有逻辑都在您的应用程序中,而不是制作 public 路由器,您需要将 "findOrCreate" 代码移动到它自己的 module/file 以便您可以从两个地方无缝调用它.

如果您的 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);
  });
}