2

私は 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' });
});

ユーザー.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;
  }); 
}

req.user にアクセスするために、everyauth.everymodule.findUserById はどのように見える必要がありますか? ログインに成功した後にreq.userをログに記録すると、デフォルトルートで「未定義」と表示されます

4

1 に答える 1

0

コードは次のようになります。

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

コードでは、代わりにコールバックを呼び出す必要がある関数から値を返しています。ノード内のほとんどすべてが非同期であり、コールバックを使用して、データベース ルックアップなどの I/O を含むすべての結果を返すことに注意してください。

于 2012-04-30T20:49:10.147 に答える