2012-01-31 39 views
2

我確實閱讀過有關通過everyauth訪問當前用戶的手冊。也就是說,我可以從我的服務器上讀取當前用戶信息:req.user我的服務器上,everyauth.user用戶在我的意見,但他們是未定義的。但是如果我嘗試從例如everyauth.twitter或everyauth.facebook獲得訪問權限,我可以從這個社交網絡獲取用戶信息。無法從everyauth獲得自定義用戶

我想,當從數據庫(查找或通過社交數據創建),它必須以會話變量保存,像currentUser,我可以在助手和其他databare請求得到它得到用戶。

我app.js代碼:

var express  = require('express') 
    , everyauth = require('everyauth') 
    , Promise  = everyauth.Promise 
    , util  = require('util') 
    , mongoose = require('mongoose') 
    , routes  = require('./routes') 
    , _   = require('underscore') 

mongoose.connect('mongodb://127.0.0.1/base'); 
var Schema = mongoose.Schema 
    , ObjectId = Schema.ObjectId; 

// Everyauth settings above that app.configure 

everyauth.twitter 
    .consumerKey('secretKey') 
    .consumerSecret('secret') 
    .findOrCreateUser(function (session, accessToken, accessTokenSecret, twitterUserData){ 
     var promise = this.Promise(); 
     User.findOrCreateByUidAndNetwork(twitterUserData.id, 'twitter', twitterUserData, promise); 
     return promise; 
    }) 
    .redirectPath('/') 
everyauth.facebook 
    .appId("secretId") 
    .appSecret("secret") 
    .findOrCreateUser(function (session, accessToken, accessTokenExtra, fbUserMetadata) { 
     var promise = this.Promise(); 
     User.findOrCreateByUidAndNetwork(fbUserMetadata.id, 'facebook', fbUserMetadata, promise); 
     return promise; 
    }) 
    .redirectPath('/'); 

var app = module.exports = express.createServer(); 

// Configuration 

app.configure(function(){ 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.use(express.bodyParser()); 
    app.use(express.cookieParser()); 
    app.use(express.session({secret:'blablabla'})); 
    app.use(everyauth.middleware()); // Yes, i'm use it 
    app.use(express.methodOverride()); 
    app.use(app.router); // And it 
    app.use(express['static'](__dirname + '/public')); 
}); 

everyauth.helpExpress(app); // And this above that routes 

app.dynamicHelpers({ 
    currentUser: function (req, res){ 
     return req.user; //it's empty! 
    } 
}) 

app.configure('development', function(){ 
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
}); 

app.configure('production', function(){ 
    app.use(express.errorHandler()); 
}); 

// Routes 

app.get('/', routes.index); 
require("./controllers/user"); 

app.listen(80); 

和用戶方案:

var Schema = mongoose.Schema 
    , ObjectId = Schema.ObjectId; 

var UserSchema = new Schema({ 
    "uid":{type:String},  
    "name":{type:String}, 
    "network":{type:String}, 
    "profile":{}   
}); 


mongoose.model('User', UserSchema); 

var User = mongoose.model('User'); 

而且用戶尋找或創造功能:

this.findOrCreateByUidAndNetwork = function(uid, network, profile, promise) { 
    User.find({uid: uid, network: network}, function(err, users) { 
     if(err) throw err; 
     if(users.length > 0) { 
      promise.fulfill(users[0]);// <-- what i want:) 
     } else { 
      var user = new User(); 
      user.network = network; 
      user.uid = uid; 
      user.profile = profile; 
      user.name = profile.first_name || profile.name; 
      user.save(function(err) { 
       if (err) throw err; 
       promise.fulfill(user); 
      }); 
     } 
    }); 
}; 

感謝,觀看我的問題。最好的問候,晚子囊

回答

3

也許有點,但對於任何人誰需要一個答案 -

在Everyauth的Github的頁面就明確規定「要訪問用戶,配置everyauth.everymodule.findUserById」。例如(再次引用bnoguchi) -

everyauth.everymodule 
    .findUserById(function (id, callback) { 
     yourApi.fetchUserById(id, function (err, user) { 
     if (err) return callback(err); 
     callback(null, user); 
    }); 
    // or more succinctly, if your api sends a user to the callback with function signature function (err, user): 
    // yourApi.fetchUserById(id, callback); 
});