Cómo manejar la respuesta en las funciones de devolución de llamada (utilizada por Cradle en NodeJS, por ejemplo)
Pregunta
Estoy usando "Express" y "Cradle" en "NodeJS". Si solicito mi base de datos, tengo que definir una devolución de llamada para manejar la respuesta. Desafortunadamente, no tengo acceso a RES (respuesta) en mi función de devolución de llamada. ¿Cuál es la mejor práctica para este problema? Aquí está mi código.
var cradle = require('cradle');
var db = new cradle.Connection().database('guestbook');
app.get('/guestbook', function(req, res) {
db.view('guestbook/all', function(err, doc) {
console.log(doc);
// How can I use res in this callback
// to send the response?
});
});
Solución
Puedes simplemente usar res
Dentro de la devolución de llamada interior.
En JavaScript, la función interna "hereda" las variables de la función exterior. O más precisamente, la función forma un cierre, que es una expresión que puede tener variables libres. El cierre une las variables de su alcance externo, que puede ser el alcance de otra función o el alcance global.
Otros consejos
Puedes intentar esto.
Lo más importante (¿quizás su trampa?) Tenga en cuenta que 'db.view' Mereley registrará un cierre de devolución de llamada y continuará. No cierre su solicitud (llamando a 'req.end') en ningún lugar fuera de este cierre. Si lo hace, es muy probable que la solicitud se haya cerrado a medida que regresa el DB. Una vez que el objeto de respuesta HTTP está cerrado, cualquier dato escrito se nula.
var cradle = require('cradle');
var db = new cradle.Connection().database('guestbook');
app.get('/guestbook', function(req, res) {
// Register callback and continue..
db.view('guestbook/all', function(err, guests) {
// console.log('The waiting had an end.. here are the results');
guests.forEach(function(guest) {
if (guest.name) {
res.write('Guest N: ' + guest.name);
}
});
// Close http response (after this no more output is possible).
res.end('That is all!')
});
console.log('Waiting for couch to return guests..');
// res.end('That is all!'); // DO NOT DO THIS!!!
});
Con este fragmento, realmente debería tener acceso a RES aquí. Deberías poder usar res.render()
o res.send()
Porque la devolución de llamada de DB está envuelta en el cierre de la función de devolución de llamada App.