2013-08-02 23 views
13

Ho ed expressjs applicazione e su un percorso specifico chiamo una funzione che risponde con un utente dal database chiamando res.json con il documento di database come parametro. Io uso le librerie basate sulla promessa e ho voluto inline la callback in cui sto inserendo il documento del database nella risposta. Ma il programma fallisce quando lo faccio. Qualcuno può spiegare perché? Mi chiedo anche perché le chiamate in linea a console.log effettivamente funzionano. C'è qualche differenza fondamentale tra i due metodi res.json e console.log?Perché non posso chiamare in linea res.json?

Ecco un esempio di cosa funziona e cosa non funziona. Si supponga che getUserFromDatabase() restituisca una promessa di un documento utente.

//This works 
var getUser = function(req, res) { 
    getUserFromDatabase().then(function(doc) { 
     res.json(doc); 
    });  
} 

//This does not work (the server never responds to the request) 
var getUserInline = function(req, res) { 
    getUserFromDatabase().then(res.json);  
} 

//This works (the object is printed to the console) 
var printUser = function(req, res) { 
    getUserFromDatabase().then(console.log);  
} 
+0

Sembra un legame problema. http://alistapart.com/article/getoutbindingsituations – randunel

risposta

12

La funzione json perde la sua corretta this vincolante quando viene utilizzato così da quando .then sta per invocarlo direttamente senza riferimento all'oggetto res genitore, in modo legano:

var getUserInline = function(req, res) { 
    getUserFromDatabase().then(res.json.bind(res));  
} 
+0

Potrebbe essere considerato un difetto nella libreria o non esiste un modo per aggirarlo quando si progetta l'oggetto res? –

+0

Ecco come funziona JavaScript. La funzione 'res.json' potrebbe essere pre-vincolata dalla libreria per te ma sarebbe molto non convenzionale in javascript. CoffeeScript consente i metodi orientati agli oggetti pre-binding con l'operatore fat arrow ("=>"), FYI. –

+0

@LudwigMagnusson 'res.json' non è una funzione ma un metodo - ciò significa che dipende da' this'. Mentre può essere fastidioso in questa situazione, si comporta molto meglio delle funzioni che hanno bisogno di portare il loro contesto con loro perché può essere assegnato staticamente. La classe 'Response' potrebbe legare automaticamente i suoi metodi, ma questa è una perdita di prestazioni enorme quando' res.json' può essere chiamato normalmente come metodo (il più delle volte può). – Esailija

Problemi correlati