【问题标题】:Configuring findByUserId for everyauth - node, express, mongoose, everyauth为everyauth 配置findByUserId - node、express、mongoose、everyauth
【发布时间】:2012-05-10 09:55:08
【问题描述】:

我对 Node.js 和 Express 比较陌生。我正在尝试使用 Twitter 完成everyauth 的配置,并且我正在尝试访问服务器端的“res.user”,根据everyauth 的文档要求配置.findByUserId。这就是我遇到麻烦的地方。如何配置 findByUserId?

这就是我得到的。它目前正在创建一个新用户或让他们登录,我还没有正确设置 .findByUserId 但让我可以访问我在服务器端需要的 req.user 。如果您对如何优化此代码有其他建议,也请告诉我,因为我只是学习。

下面编辑的代码...

App.js

var express = require('express')
  , everyauth   = require('everyauth')
  , util        = require('util')
  , Promise     = everyauth.Promise
  , users       = require('./lib/users')
  , config      = require('./config.js')
  , twitter     = require('./lib/twitter')
  , games        = require('./lib/games')

  everyauth.twitter
    .consumerKey(config.twitter.consumerKey)
    .consumerSecret(config.twitter.consumerSecret)
    .findOrCreateUser( function (session, accessToken, accessTokenSecret, twitterUserMetadata) {
      var promise = this.Promise();
      users.findOrCreateUserbyTwitterData(twitterUserMetadata, accessToken, accessTokenSecret, promise)
      return promise;
    })
    .redirectPath('/');
  everyauth.everymodule.findUserById(function (userId, callback) {
      users.findById(userId, callback);
  });

var app = module.exports = express.createServer();
everyauth.helpExpress(app);
// Configuration

app.configure(function(){
  app.set('views', __dirname + '/views');
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser());
  app.use(express.session({secret: "FxT10477A93d54HJx5"}));
  app.use(everyauth.middleware());
  app.set('view engine', 'jade');
  app.use(express.static(__dirname + '/public'));
});

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

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

// Routes

app.get('/', function(req, res){
  console.log(req.user);
  res.render('index', { title: 'Zeitheist 2' });
});

Users.js

var twitter = require(__dirname + "/twitter");
var mongoose = require('mongoose');
var Schema = mongoose.Schema
  , ObjectId = Schema.ObjectId;

var userSchema = new Schema({
    user                  : ObjectId
    , id                  : Number
    , twitterId           : Number
    , twitterName         : String
    , profileImageUrl     : String
    , name                : String
    , dateCreated         : Date
    , session             : String
    , accessToken         : String
    , accessTokenSecret   : String
});

var conn = mongoose.createConnection('mongodb://localhost/zeitheist2_test');
var userModel = conn.model('User', userSchema);

this.findOrCreateUserbyTwitterData = function(twitterData, accessToken, accessTokenSecret, promise) {
  userModel.find({'twitterId' : twitterData.id}, function(err, users) {
     if(err) throw err;
     if(users.length > 0) {
       promise.fulfill(users[0]);
     } else {
       var user = new userModel();
       user.twitterId = twitterData.id
       user.twitterName = twitterData.screen_name
       user.profileImageUrl = twitterData.profile_image_url
       user.name = twitterData.name
       user.accessToken = accessToken
       user.accessTokenSecret = accessTokenSecret
       user.save(function(err) {
         if (err) throw err;
         twitter.follow(accessToken, accessTokenSecret);
         promise.fulfill(user);
       });
     }
   });
}
this.findById = function(userId, callback) {
  userModel.findOne({'_id' : userId}, function(err, user) {
    if(err) throw err;
    if(callback) 
      callback(user);
    else
      return user;
  }); 
}

everyauth.everymodule.findUserById 需要如何查看才能让我访问 req.user?在我成功登录后登录 req.user 时的默认路由中,它显示“未定义”

【问题讨论】:

    标签: node.js express mongoose everyauth


    【解决方案1】:

    您的代码应如下所示:

    everyauth.everymodule.findUserById(function (userId, callback) {
        userModel.findById(userId, callback);
    });
    

    在您的代码中,您从应该调用回调的函数返回值。请记住,node 中的大多数内容都是异步的,并且使用回调来返回任何涉及 I/O 的结果,例如数据库查找。

    【讨论】:

    • 您好 JohnnyHK,我根据您的建议对原始帖子中的代码进行了更新。具体来说,我更改了everyauth.everymodule.findUserById 函数以匹配您的示例,并更新了我的.findById 访问器我的users.js。我仍然没有得到 req.user。还有其他想法吗?
    • 默认情况下,everyauth 使用用户对象中的“id”主键字段,因此该字段将持久保存到会话并传递到您注册的 findUserById 回调中。因此,如果您没有修改默认值,则需要更改 findById 的 findOne 调用以传递 {'id': userId}。
    猜你喜欢
    • 2012-11-26
    • 2013-11-05
    • 2012-06-25
    • 2013-01-20
    • 2011-11-02
    • 2012-12-21
    • 2015-10-16
    • 2014-05-21
    • 2012-08-12
    相关资源
    最近更新 更多