模块导出回调函数 returns 未定义

Module Export callback function returns undefined

您好:我是 nodejs 和 mocha 的新手。我试图使用 module.exports 到 return 来自回调函数的值。但是,它 returning 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); //???????
    });
}

因为你说你是 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/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);
    });
  }
}

我更改了 2 项主要内容以使其正常工作。

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

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

最好阅读一些有关异步函数工作原理的文章。