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); //??????? }); }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.
Eliminé require.js. No necesita usar eso en node.js porque ya se incluye un cargador de módulos.
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.