模块导出回调函数返回undefined

时间:2017-04-25 15:07:47

标签: node.js mocha requestjs

您好:我是nodejs和mocha的新手。我尝试使用module.exports从回调函数返回一个值。但是,它返回undefined。对于简单的情况,它可以工作。请帮忙。

结果

  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); //???????
    });
}

1 个答案:

答案 0 :(得分:1)

因为你说你是nodejs和mocha的新手,我认为你不想做任何花哨的事情并简化你的代码。

<强>结果

  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)

<强>测试/ test.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);
    });
  }
}

我改变了两件大事让它发挥作用。

  1. 我删除了require.js.您不需要在node.js中使用它,因为已经包含了模块加载器。

  2. 在javascript中有同步和异步功能。同步函数是您从其他编程语言(如PHP或Java)中了解的常规函数​​。但是,javascript也有异步功能。不同之处在于异步函数中的代码将在稍后执行,您不能指望它立即返回值。例如,查看测试的输出并将其与代码进行比较。如您所见,console.log('test');console.log(res)之前打印,即使它低于另一个。为了解决这个问题,javascript使用了回调(或Promises)。回调就像告诉程序一旦异步函数完成它应该继续的方式。在您的情况下,HTTP-Request是异步的,因此您需要告诉您的代码“等待”它完成然后打印它。 done用于在测试结束时告诉mocha。

  3. 如果你阅读一些关于异步函数如何工作的文章,那可能是最好的。