NodeJS http.request no devuelve datos incluso después de especificar retorno en el evento ‘final’

Básicamente, estoy tratando de eliminar algunos datos del sitio web y realizar la extracción, eliminación y actualización de DOM en una función de callback vinculada al evento ‘final’ de http.request .

También he devuelto los datos de la callback del evento 'end' pero no está recibiendo en mi función de callback de ruta. Me quedo undefined allí.

A continuación se muestra el bloque de código:

 var scraper = { extractEmail: function (directoryName) { var result = getDirectory(directoryName); if (result !== 404) { var protocol = result.https ? https : http; protocol.request({ host: 'somevalue.net', method: "GET" }, function (res) { var data = ''; res.on('data', function (chunk) { data += chunk; }); res.on('end', function () { return data; }); }) .on('error', function (err) { return err; }) .end(); //return data; } else { //return "Failed"; } } }; 

Y aquí está la función Routes.js:

 app.get('/:directory', function (req, res) { var n = scraper.extractEmail(req.params.directory); console.log(n); res.send(n); }); 

Aquí también no obtengo el valor de n .

¿Está su ‘var scraper’ también en el archivo route.js? Supongo que no lo es y no puede acceder a ese otro archivo js, ​​para hacerlo use module.exports

p.ej.

 // module.js var name = "foobar"; // export it exports.name = name; Then, in route.js... > //route.js > // get a reference to your required module > var myModule = require('./module'); > //correct path to folder where your above file is > // name is a member of myModule due to the export above > var name = myModule.name; 

No puede devolver un valor de una callback asíncrona. Bueno, puedes, pero lo más probable es que sea ignorado y seguramente no hará lo que quieres.

Ni siquiera puedes devolver una promesa en ese lugar. Solo puede resolver una promesa donde ahora usa las declaraciones de devolución. Debe devolver una promesa de la función principal y luego resolver o rechazar la promesa en los manejadores de eventos donde usa las devoluciones ahora.

Para más información ver esas respuestas:

  • Devolver el resultado de la promesa en lugar de la promesa en Nodejs
  • Valor de retorno en función de un bloque de promesa
  • jQuery: Devolver datos después del éxito de la llamada ajax

La modificación más simple que hará que esto funcione es pasar una función de callback a extractEmail para recibir los datos una vez que esté listo.

 var scraper = { extractEmail: function (directoryName, cb) { var result = getDirectory(directoryName); if (result !== 404) { var protocol = result.https ? https : http; protocol.request({ host: 'somevalue.net', method: "GET" }, function (res) { var data = ''; res.on('data', function (chunk) { data += chunk; }); res.on('end', function () { cb(null, data); }); }) .on('error', function (err) { cb(err); }) .end(); } else { cb(new Error('Failed')); } } }; 

Y úsalo así:

 app.get('/:directory', function (req, res) { scraper.extractEmail(req.params.directory, function(err, n) { if (err) return console.error(err); console.log(n); res.send(n); }); });