Cómo manejar la respuesta en las funciones de devolución de llamada (utilizada por Cradle en NodeJS, por ejemplo)

StackOverflow https://stackoverflow.com/questions/5304320

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?
  });
});
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top