Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

364
Vistas
La función de devolución de llamada de exportación del módulo devuelve indefinido

Hola: soy nuevo en nodejs y mocha. Intento usar module.exports para devolver un valor de una función de devolución de llamada. Sin embargo, está regresando undefined . Sin embargo, para casos simples funciona. Por favor ayuda.

Resultado

 Module Export Example √ Test Case 1: Module Hello Node World!!! (*** this works - its a direct return ***) √ Test Case 2: Module undefined (*** this fails - its from a callback fn ***)

google.js

 var requirejs = require('requirejs'); requirejs.config({ baseUrl: '.', paths: { }, nodeRequire: require }); describe('Module Export Example', function(){ var mod; before(function(done){ requirejs(['./googleModule'], function(_mod) { mod = _mod; done(); }); }); it('Test Case 1: Module', function(done){ console.log(mod.get(done)); }); it('Test Case 2: Module', function(done){ console.log(mod.google(done)); }); });

googleModule.js

 var request = require('request'); module.exports = { get: function(done){ var a = "Hello Node World!!!"; return(done(), a); }, google: function(done){ var a = doCallback(function(){ var b = "PRINT DATA: " + data.statusCode + ' ' + data.headers['content-type']; return(done(), b); }); return(done(), a); } } function doCallback(callback, done){ var options = {url: 'http://www.google.com', headers: {'Content-Type': 'text/html'}, encoding: null}; request.get(options, function(err, res, body){ var a = callback(res, done); return (callback(), a); //??????? }); }
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Debido a que dice que es nuevo en nodejs y mocha, asumo que no quería hacer nada elegante y simplificó su código.

Resultado

 Module Export Example Hello Node World!!! ✓ Test Case 1: Module test PRINT DATA: 200 text/html; charset=ISO-8859-1 ✓ Test Case 2: Module (194ms)

prueba/prueba.js

 let mod = require('../googleModule'); describe('Module Export Example', function(){ it('Test Case 1: Module', function(){ console.log(mod.get()); // this is synchronous, no done needed }); it('Test Case 2: Module', function(done){ mod.google(function(res) { console.log(res); done(); // this is asynchronous, so we need to tell mocha when we are done }); console.log('test'); }); });

googleModule.js

 let request = require('request'); module.exports = { get: function() { let a = "Hello Node World!!!"; return a; }, google: function(callback) { let options = {url: 'http://www.google.com', headers: {'Content-Type': 'text/html'}, encoding: null}; request.get(options, function(err, res, body) { var b = "PRINT DATA: " + res.statusCode + ' ' + res.headers['content-type']; callback(b); }); } }

Cambié 2 cosas importantes para que funcione.

  1. Eliminé require.js. No necesita usar eso en node.js porque ya se incluye un cargador de módulos.

  2. En javascript hay funciones síncronas y asíncronas. Las funciones sincrónicas son funciones regulares que conoce de otros lenguajes de programación como PHP o Java. Sin embargo, javascript también tiene funciones asíncronas. La diferencia es que el código dentro de una función asíncrona se ejecutará más tarde y no puede esperar que devuelva el valor inmediatamente. Como ejemplo, mire el resultado de su prueba y compárelo con su código. Como puede ver, console.log('test'); se imprime ANTES de console.log(res) , aunque está debajo del otro. Para manejar esto, javascript hace uso de devoluciones de llamada (o Promesas). Una devolución de llamada es como una forma de decirle al programa dónde debe continuar una vez que finaliza la función asíncrona. En su caso, la solicitud HTTP es asíncrona, por lo que debe indicarle a su código que "espere" a que finalice y luego lo imprima. El done se usa para decirle a mocha cuando la prueba ha terminado.

Probablemente sea mejor si lee algunos artículos sobre cómo funcionan las funciones asíncronas.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda