2017-04-25 8 views
-1

안녕하세요, 저는 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); //??????? 
    }); 
} 
+0

require.js를 사용하는 이유가 있습니까? –

답변

1

당신 SA가 있기 때문에 y 당신은 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); 
    }); 
    } 
} 

는 I 변경됨 2 박막 주요 gs가 작동하도록하십시오.

  1. require.js가 삭제되었습니다. 모듈 로더가 이미 포함되어 있기 때문에 node.js에서 사용할 필요가 없습니다.

  2. 자바 스크립트에는 동기식 및 비동기식 기능이 있습니다. 동기 함수는 PHP 나 Java와 같은 다른 프로그래밍 언어에서 알 수있는 정규 함수입니다. 그러나 자바 스크립트도 비동기 함수를 가지고 있습니다. 차이점은 비동기 함수 내부의 코드가 나중에 실행되며 값을 즉시 반환 할 것이라고 기대할 수 없다는 것입니다. 예를 들어, 테스트 결과를보고이를 코드와 비교하십시오. 보시다시피 console.log('test');이 (가) console.log(res)보다 먼저 인쇄됩니다. 이것을 처리하기 위해 자바 스크립트는 콜백 (또는 약속)을 ​​사용합니다. 콜백은 비동기 함수가 끝나면 어디에서 계속해야하는지 프로그램에 알려주는 것과 같습니다. 귀하의 경우 HTTP 요청은 비동기식이므로 코드가 완료되고 인쇄되도록 코드에 지시해야합니다. done은 테스트가 끝나면 모카에게 알리는 데 사용됩니다.

비동기 기능의 작동 방식에 대한 기사를 읽는 것이 가장 좋습니다.

+0

안녕하십니까? Andreas Gassmann, 솔루션과 설명을 제공해 주셔서 감사합니다. 예, 기사를 읽는 중입니다. 사실 많은 기사가 있습니다. 그러나 새로운 것, 나는 창공에서 길을 잃는다. 그리고 당신과 같은 사람은 그렇게 나와 같은 사람을 위해 물건을 밝게한다. 다시 한번 감사드립니다. –