2012-04-30 4 views
2

나는 Node.js와 Express를 사용하는 것이 다소 새로운 편이다. 나는 트위터로 everyauth의 구성을 끝내려고 노력하고 있으며 모든 autauth의 문서에 따라 .findByUserId가 구성되도록 서버 측의 'res.user'에 액세스하려고합니다. 그게 내가 곤경에 처한 곳이야. 어떻게 findByUserId를 구성합니까?모든 auth에 대해 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에 액세스 하시겠습니까? 나는 성공적으로 로그인 한 후 req.user 로그 기본 경로에서는

답변

0

귀하의 코드는 다음과 같이 보일 것 "정의되지 않은"보여주는 : 당신이 함수에서 값을 반환하고

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

코드에서를이 대신 콜백을 호출해야합니다. 노드의 대부분은 비동기이며 콜백을 사용하여 데이터베이스 조회와 같은 I/O 관련 결과를 반환한다는 점을 기억하십시오.

+0

안녕하세요 JohnnyHK, 귀하의 제안에 따라 원래 게시물의 코드를 업데이트했습니다. 특히 everyauth.everymodule.findUserById 함수를 예제와 일치하도록 변경하고 내 .findById 접근 자 또는 내 users.js도 업데이트했습니다. 나는 아직도 req.user를 얻지 못하고있다. 다른 아이디어? – aressidi

+0

기본적으로 everyauth는 사용자 개체의 "id"라는 기본 키 필드를 사용하므로 세션에 유지되고 등록 된 findUserById 콜백으로 전달되는 해당 필드입니다. 따라서 기본값을 수정하지 않았다면 대신 findById의 findOne 호출을 변경하여 { 'id': userId}를 전달해야합니다. – JohnnyHK

관련 문제