我确实阅读了有关通过everyauth访问当前用户的手册。也就是说,我可以从我的服务器上的 req.user ,我的视图中的 everyauth.user 和用户中读取当前用户信息,但是他们是未定义的。但是,如果我尝试从例如everyauth.twitter或everyauth.facebook获取访问权限,我将从此社交网络获取用户信息。
我想要,当从数据库中获取用户(通过社交数据查找或创建)时,必须保存在会话变量中,例如 currentUser ,我可以在帮助程序和其他数据库请求中获取它
我的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);
});
}
});
};
谢谢,看着我的问题。此致,Asci
答案 0 :(得分: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);
});