javascript - 无法从 everyauth 获取自定义用户

标签 javascript node.js mongodb everyauth

我确实阅读了有关通过 everyauth 访问当前用户的手册。据说,我可以从服务器上的 req.user 、我的 View 上的 everyauth.useruser 读取当前用户信息,但是它们是未定义的。但是,如果我尝试从 everyauth.twitter 或 everyauth.facebook 等进行访问,我将从该社交网络获取用户信息。

我想要,当从数据库获取用户(通过社交数据查找或创建)时,它必须保存在 session 变量中,例如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);
            });
        }
    });
};

谢谢您观看我的问题。最好的问候,阿斯西

最佳答案

可能有点晚了,但对于任何需要答案的人来说 -

在 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);
});

关于javascript - 无法从 everyauth 获取自定义用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9075659/

相关文章:

c# - 在 C# 中解析 Javascript 日期的最简单方法?

javascript - 访问外部对象的 'this' (javascript)

node.js - Node 缓存的导出对象已损坏

node.js - Vanilla Node 与 express

unit-testing - 使用 cloud9 的 mocha 测试,从 node.js 执行 mocha 测试

mongodb - 如何使用 Mongodb 的 $nin、$in 等运算符提高查询性能

Javascript createElement,修改输出

javascript - this.userId 未定义 MongoDB 属性未在提交后插入

即使在索引字段上,mongodb $all 和 $in 也非常慢

javascript - 如何从一系列文本区域(用户输入)中获取平均数?