2012-05-02 9 views
13

Vorrei creare una specie di prima del filtro che mi permette di rendere l'utente corrente disponibile in tutte le azioni. L'approccio followint funziona bene e non ho nemmeno bisogno di dichiarare una variabile globale:Come faccio a passare le variabili dal middleware di Connect in app.get-action?

app.use(function(req, res, next){ 
    if(req.session.user_id){ 
     /* Get user from database 
      and share it in a variable 
      that can be accessed frooom ... 
     */ 
     User.find({ /* ... */ }, function(err, users){ 
      if(users.length == 1){ 
       req.current_user = users[0]; 
      } 
      next(); 
     }); 
    } 
    else{ 
     next(); 
    } 
}); 

app.get('/', function(req, res){ 
    // ... here!! 
    console.log(req.current_user); 
    res.render('index', { 
     current_user: req.current_user, 
    }); 
}); 

Ma io sono ancora incerti se va bene per manipolare req, perché non so se è giusto cambiare qualcosa non è di mia proprietà? C'è un modo migliore per farlo?

risposta

21

andare avanti a destra e virare su oggetti da req! Quando stavo iniziando con Node.js e JavaScript, questo mi è sembrato molto strano (provenendo da uno sfondo prevalentemente C++). È, tuttavia, del tutto naturale dato il prototipo di modello di oggetti di JavaScript. Dopo esserti comodo, ti renderai conto che puoi fare cose potenti in un codice succinto.

Sono lo sviluppatore di Passport (fornita dal commentatore precedente). Se avete intenzione di sviluppare middleware che possono essere riutilizzati attraverso applicazioni, il mio consiglio è di pagare un po 'di attenzione a come lo chiamate le proprietà che si aggiungono a req o res, al fine di evitare potenziali conflitti con altri middleware nella stessa applicazione.

Ad esempio, Passport imposta user a req.user, ma offre un'opzione per cambiarlo (quindi un'app può dire impostarlo su req.currentUser, ad esempio.). Le variabili interne e private sono associate a una proprietà req._passport.

+0

E 'solo io e il mio compagno di squadra che avrà bisogno di lavorare con lui, quindi in questo caso, non v'è un elevato potenziale per accidentalmente utilizzando lo stesso nome della proprietà in due contesti diversi. Tuttavia, il tuo suggerimento di rendere il nome modificabile è molto utile. Grazie anche per la tua risposta! – YMMD

Problemi correlati