改进node.js代码(后缀,承诺和护照)

我是node.js中的新手,续集,蓝鸟许诺和FBauthentication。

我想坚持我的FBauthentication用户身份validation的细节。

在我的模型中,一个用户可以同时拥有多个身份validation(一个用于浏览器,另一个用于移动设备等)。 我需要照顾这些authentication,所以我有下一个关系:

User.hasMany(AUTH); Auth.belongsTo(用户);

我写了这个代码,但我仍然在寻找一个更聪明的解决scheme。

主要目标是将authentication信息添加到用户。 所以,在validation信息之前,我寻找一个持久的用户。

function(accessToken, refreshToken, profile, done) { console.log("FacebookStrategy_function:\naccessToken: " + accessToken); var thatUser=null; User.find({ where: { username: profile.username }, include: [{model: Auth}] }).then(function(user) { console.log("USER IS #1: %j", user); if(user!= null){ // User found in database console.log("User " + profile.id + "found in database"); return user; }else{ // First time that user authenticate in app var user = User.build({ username: profile.username, givenName: profile.name.givenName, familyName: profile.name.familyName }); return user.save(); } }).then(function(user) { console.log("USER IS #2: %j", user); thatUser=user; var auth= Auth.build({ provider: 'facebook', providerId: profile.id, accessToken: accessToken }); return user.addAuth(auth); }).then(function(auth){ user=thatUser; console.log("USER IS #3: %j", user); console.log("done. user and association saved. auth is: %j", auth); done(null, user); // Call FacebookEstrategy's done }, function(err) { console.log("\nsomething happened persisting user/auth " + err); done(err, null); // Propagate error to FacebookEstrategy }); } 

有下一个日志:

  FacebookStrategy_function: accessToken: CAACO... Executing (default): SELECT "Users".*, "Auths"."id" AS "Auths.id", ... WHERE "Users"."username"='john.doe'... INSERT INTO "Users" ("id","username","givenName","familyName","createdAt","updatedAt") VALUES (DEFAULT,'john.doe',...) USER IS #1: null Executing (default): INSERT INTO "Users" ("id","username","givenName","familyName","createdAt","updatedAt") VALUES (DEFAULT,'john.doe',...) USER IS #2: {"username":"john.doe","givenName":"John","familyName":"Doe","id":2,"updatedAt":"2014-11-09T19:12:23.250Z","createdAt":"2014-11-09T19:12:23.250Z"} Executing (default): SELECT * FROM "Auths" WHERE "UserId" = 2; Executing (default): INSERT INTO "Auths" ("id","provider","providerId","accessToken","createdAt","updatedAt","UserId") VALUES (DEFAULT,'facebook','...','CAACO...','2014-11-09 19:12:23.278 +00:00','2014-11-09 19:12:23.278 +00:00',2) RETURNING *; USER IS #3: {"username":"john.doe","givenName":"John","familyName":"Doe","id":2,"updatedAt":"2014-11-09T19:12:23.250Z","createdAt":"2014-11-09T19:12:23.250Z"} done. user and association saved. auth is: {"provider":"facebook","providerId":"...","accessToken":"CAACO...","id":2,"UserId":2,"updatedAt":"2014-11-09T19:12:23.278Z","createdAt":"2014-11-09T19:12:23.278Z"} 

对我来说,是要处理,该user.addAuth(身份validation)返回一个身份validation对象。 在接下来的方法,我期望收到一个用户对象(而不是身份validation)作为解决方法,我在主要function范围内使用一个糟糕的用户variables。 有没有更聪明的方法来做到这一点?

在日志中,跟踪“USER IS#3:”显示没有其authentication对象的用户。 为什么?

任何改正或改进都将是顺利的

谢谢

如果您使用承诺 – 您可以放弃donecallback – 您可以简单地返回承诺。 如果你真的想要完成callback – 你可以调用.nodeify而不是明确地调用它,虽然返回promise还有其他的好处,比如未处理的拒绝跟踪。

您也可以使用聚合方法而不是显式闭包范围:

 function(accessToken, refreshToken, profile) { console.log("FacebookStrategy_function:\naccessToken: " + accessToken); return User.find({ where: { username: profile.username }, include: [{model: Auth}] }).then(function(user) { console.log("USER IS #1: %j", user); if(user!= null){ // User found in database console.log("User " + profile.id + "found in database"); return user; } return User.build({ // first time username: profile.username, givenName: profile.name.givenName, familyName: profile.name.familyName }).save(); }).then(function(user) { console.log("USER IS #2: %j", user); var auth= Auth.build({ provider: 'facebook', providerId: profile.id, accessToken: accessToken }); return [user, user.addAuth(auth)]; // note the array }).spread(function(user, auth){ // note the spread console.log("USER IS #3: %j", user); console.log("done. user and association saved. auth is: %j", auth); return user; }); } 

现在,如果我可以放弃所有的console.log ,这会变得更短:

 function(accessToken, refreshToken, profile) { return User.find({ where: { username: profile.username }, include: [{model: Auth}] }).then(function(user) { return user || User.build({ // first time username: profile.username, givenName: profile.name.givenName, familyName: profile.name.familyName }).save(); }).then(function(user) { return Auth.build({ provider: 'facebook', providerId: profile.id, accessToken: accessToken }).return(user); }); }