2012-04-30 10 views
2

私はNode.jsとExpressを使い始めました。私はTwitterですべてのauthの設定を完了しようとしており、everyauthのドキュメントに従って.findByUserIdが設定されることを要求するサーバー側の 'res.user'にアクセスしようとしています。それが私の問題を抱えている場所です。どのようにfindByUserIdを設定しますか?すべてのオートに関するfindByUserIdの設定 - node、express、mongoose、everyauth

これは私が得たものです。現在、新しいユーザーを作成したりログインしたりするために、.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 everyauth.everymodule.findUserByIdはに私のために順番に見てする必要がありますどのよう

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(function (userId, callback) { 
    userModel.findById(userId, callback); 
}); 

:デフォルトルートIが正常にログインした後、私はreq.userにログインしたとき、あなたのコードは次のようになります「未定義」

答えて

0

を示す年代に代わりにコールバックを呼び出す必要があります。ノードのほとんどは非同期であり、コールバックを使用してI/Oを含むデータベース検索のような結果を返すことを覚えておいてください。

+0

こんにちはJohnnyHK、私はあなたの提案に従って元の投稿のコードを更新しました。具体的には、everyauth.everymodule.findUserById関数をあなたの例に合わせて変更し、私の.findByIdアクセサまたはusers.jsも更新しました。私はまだreq.userを取得していません。他のアイデア? – aressidi

+0

デフォルトでは、everyauthはユーザーオブジェクトの "id"というプライマリキーフィールドを使用するため、セッションに保持され、登録済みのfindUserByIdコールバックに渡されるのはそのフィールドです。デフォルトを変更していない場合は、findByIdのfindOne呼び出しを変更して、代わりに{'id':userId}を渡す必要があります。 – JohnnyHK

関連する問題