2012-12-11 19 views
13

sto cercando di ottenere il passaporto per funzionare con il mio server express nodo. Posso accedere con Facebook e trovare l'utente corretto nel mio database; tuttavia, quando reindirizzamento req.user è sempre indefinito. Ecco il mio codice server:req.user undefined - node + express + passport-facebook

Vado su/auth/facebook, trova l'utente corretto e mi reindirizza a /. Ma poi vado a/auth/utente e req.user non è definita e le mie sessioni di mostrare questo:

cookies: { 'connect.sid': 's:JFdQkihKQQyR4q70q7h2zWFt.VS+te0pT0z/Gtwg7w5B33naCvA/ckKMk60SFenObxUU' }, 
    signedCookies: {}, 
    url: '/auth/user', 
    method: 'GET', 
    sessionStore: 
    { sessions: 
     { '5sk3Txa2vs5sYhvtdYwGaUZx': '{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"passport":{"user":"50c527c9c6cb41860b000001"}}', 
     'Au6m0hAj/3warKOGNSWw0yu2': '{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"passport":{}}', 
     JFdQkihKQQyR4q70q7h2zWFt: '{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"passport":{}}' }, 
    generate: [Function], 
    _events: { disconnect: [Function], connect: [Function] } }, 
    sessionID: 'JFdQkihKQQyR4q70q7h2zWFt', 

Ha qualcosa a che fare con il mio sessionID che non corrisponde la sessione in cui si trova l'utente passaporto?

Aggiornamento

Così ho deciso che il sessionID che non corrisponde era perché io corro il mio codice su c9.io ed ha in realtà due URL. Quando uso l'URL corretto e vado a/auth/user il mio sessionID corrisponde alla sessione con set di passaporti utente e posso vedere nel registro il mio deserializeUser che trova l'oggetto utente corretto. Tuttavia, req.user non è ancora definito dopo questo.

Trying to find user with id: 50c527c9c6cb41860b000001 
{ sessions: 
    { yoOUOxyXZ0SmutA0t5xUr6nI: '{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"passport":{"user":"50c527c9c6cb41860b000001"}}', 
    goZpmK3y3tOfn660hRbz2hSa: '{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"passport":{}}', 
    'O5Sz1GuZqUO8aOw4Vm/hriuC': '{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"passport":{}}' }, 
    generate: [Function], 
    _events: { disconnect: [Function], connect: [Function] } } 
sessionID: yoOUOxyXZ0SmutA0t5xUr6nI 
req.user: undefined 
{ cookie: 
    { path: '/', 
    _expires: null, 
    originalMaxAge: null, 
    httpOnly: true }, 
    passport: {} } 

Update2

ho capito il problema. E 'stato nella mia funzione user.findByID:

exports.findById = function(id, callback) {  
    console.log('Trying to find user with id: ' + id); 
    db.collection('users').findOne({'_id':id}, function(err, user) {   
      callback(err, user); 
    }); 
}; 

cambiato in:

exports.findById = function(id, callback) {  
    console.log('Trying to find user with id: ' + id); 
    db.collection('users').findOne({'_id':new BSON.ObjectID(id)}, function(err, user) {   
      callback(err, user); 
    }); 
}; 
+3

Un'altra nota: guardatevi ordine di definizione di itinerari espressi - lo fa importa quando si definisce 'app.get' o qualsiasi altro percorso. Poiché è possibile definire il percorso dell'utente prima del middleware del passaporto in modo che in questo modo non ci siano dati dell'utente. (Non è specificamente il tuo caso, ma ha sintomi molto simili). – moka

+2

quindi funziona ora? postarlo come risposta se è così –

+0

Uno strumento utile è quello di copiare e incollare il nodo in JSHint http://www.jshint.com È inoltre possibile eseguire un'attività di tipo Grunt per fare in modo che JSHint guardi il proprio codice. –

risposta

1

Come hai detto in si aggiorna era la variabile user._id non essere in un formato valido. Per evitare questo e dover occuparsi di questo formato in seguito in altre richieste e metodi ti consiglierò di generare un nuovo ID utente al momento dell'iscrizione.

È possibile utilizzare questo modulo:

node-uuid

var uuid = require('node-uuid'); 

function findOrCreate(profile, callback) { 
    // save new profile 
    profile.uid = uuid.v1().replace(/\-/g, ''); 
} 
Problemi correlati