我坚持这个并且不确定如何继续。
我在节点上使用 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调用)。
您的意见将受到高度赞赏。
谢谢, 砂眼
答案 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);
});
}