您好:我是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 :(得分: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);
});
}
}
我改变了两件大事让它发挥作用。
我删除了require.js.您不需要在node.js中使用它,因为已经包含了模块加载器。
在javascript中有同步和异步功能。同步函数是您从其他编程语言(如PHP或Java)中了解的常规函数。但是,javascript也有异步功能。不同之处在于异步函数中的代码将在稍后执行,您不能指望它立即返回值。例如,查看测试的输出并将其与代码进行比较。如您所见,console.log('test');
在console.log(res)
之前打印,即使它低于另一个。为了解决这个问题,javascript使用了回调(或Promises)。回调就像告诉程序一旦异步函数完成它应该继续的方式。在您的情况下,HTTP-Request是异步的,因此您需要告诉您的代码“等待”它完成然后打印它。 done
用于在测试结束时告诉mocha。
如果你阅读一些关于异步函数如何工作的文章,那可能是最好的。