나는 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 로그 기본 경로에서는
이
안녕하세요 JohnnyHK, 귀하의 제안에 따라 원래 게시물의 코드를 업데이트했습니다. 특히 everyauth.everymodule.findUserById 함수를 예제와 일치하도록 변경하고 내 .findById 접근 자 또는 내 users.js도 업데이트했습니다. 나는 아직도 req.user를 얻지 못하고있다. 다른 아이디어? – aressidi
기본적으로 everyauth는 사용자 개체의 "id"라는 기본 키 필드를 사용하므로 세션에 유지되고 등록 된 findUserById 콜백으로 전달되는 해당 필드입니다. 따라서 기본값을 수정하지 않았다면 대신 findById의 findOne 호출을 변경하여 { 'id': userId}를 전달해야합니다. – JohnnyHK