模块导出回调函数 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 项主要内容以使其正常工作。
我删除了require.js。您不需要在 node.js 中使用它,因为已经包含了模块加载器。
在javascript中有同步函数和异步函数。同步函数是您从 PHP 或 Java 等其他编程语言中了解到的常规函数。但是,javascript 也有异步功能。不同之处在于,异步函数中的代码将在稍后执行,您不能期望它立即 return 该值。例如,查看测试的输出并将其与您的代码进行比较。如您所见,console.log('test');
在 console.log(res)
之前打印,即使它在另一个下方。为了处理这个问题,javascript 使用了回调(或 Promises)。回调就像一种告诉程序在异步函数完成后应该从哪里继续的方式。在你的例子中,HTTP-Request 是异步的,所以你需要告诉你的代码 "wait" 让它完成然后打印它。 done
用于在测试完成时告诉 mocha。
最好阅读一些有关异步函数工作原理的文章。
您好:我是 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 项主要内容以使其正常工作。
我删除了require.js。您不需要在 node.js 中使用它,因为已经包含了模块加载器。
在javascript中有同步函数和异步函数。同步函数是您从 PHP 或 Java 等其他编程语言中了解到的常规函数。但是,javascript 也有异步功能。不同之处在于,异步函数中的代码将在稍后执行,您不能期望它立即 return 该值。例如,查看测试的输出并将其与您的代码进行比较。如您所见,
console.log('test');
在console.log(res)
之前打印,即使它在另一个下方。为了处理这个问题,javascript 使用了回调(或 Promises)。回调就像一种告诉程序在异步函数完成后应该从哪里继续的方式。在你的例子中,HTTP-Request 是异步的,所以你需要告诉你的代码 "wait" 让它完成然后打印它。done
用于在测试完成时告诉 mocha。
最好阅读一些有关异步函数工作原理的文章。