在 passpost.js 中使用 Facebook 策略时 - 用户不会返回
When using Facebook strategy in passpost.js - user doesn't get returned
我一直卡在这个问题上,不确定如何进行。
我在 node 和 express 上使用 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);
});
}
我一直卡在这个问题上,不确定如何进行。
我在 node 和 express 上使用 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);
});
}