Node.js NodeJS,函数调用即使在完成后也不会返回未定义
你好:我是nodejs和mocha的新手。我正在努力处理函数调用的返回值。它总是返回“undefined”,即使(我认为)我已经正确地使用了callback done() 在下面的示例中,如何确保get()的返回值始终返回正确的值而不是“未定义”的值。在这个函数中,我使用requestJS模块打开google.com并返回内容类型。但是,它当前返回undefined 非常感谢 更新后的反馈:Node.js NodeJS,函数调用即使在完成后也不会返回未定义,node.js,mocha.js,requestjs,Node.js,Mocha.js,Requestjs,你好:我是nodejs和mocha的新手。我正在努力处理函数调用的返回值。它总是返回“undefined”,即使(我认为)我已经正确地使用了callback done() 在下面的示例中,如何确保get()的返回值始终返回正确的值而不是“未定义”的值。在这个函数中,我使用requestJS模块打开google.com并返回内容类型。但是,它当前返回undefined 非常感谢 更新后的反馈: 包括测试用例3示例,用于实现回调结果是:我现在可以根据需要打印数据。但是,我得到一个错误,告诉我调用d
- 包括
示例,用于实现测试用例3
结果是:我现在可以根据需要打印数据。但是,我得到一个错误,告诉我调用done()。我做的不对吗回调
suite
PRINT DATA: 200 text/html; charset=ISO-8859-1
√ Test case 1 (607ms)
undefined (<< ****** how to return the correct value?** )
PRINT DATA: 200 text/html; charset=ISO-8859-1
√ Test case 2 (603ms)
PRINT DATA: 200 text/html; charset=ISO-8859-1
√ Test case 3
Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.
...
一种可能的解决方案(使用回调)
一种可能的解决方案(使用承诺)
一种可能的解决方案(使用回调)
一种可能的解决方案(使用承诺)
欢迎来到异步的精彩世界!你不能那样做;您需要使用回电或承诺。感谢@SLaks为您提供指导。现在,我在原始问题中添加了一个
回调的示例。请参考测试用例3
。我现在正在获取数据,但我得到一个错误,告诉我调用done()。我不知道如何解决这个问题。也许我的方法是错误的。请提供帮助。您正在向只接受一个参数的函数传递两个参数。你以为那会怎么样?@SLaks,我完全被卡住了。我也尝试删除第二个参数。问题似乎出现在doCallback()
中,其中调用了request.get(…)
。正确的执行方法是什么?再次感谢。你好@SLaks,它可能与node有关吗?我正在使用节点v7.9.0
和请求JS v2.81.0
。我使用node v 6.9.0
和request(删除mocha元素后)尝试了它。get(…)
被正确调用。欢迎来到奇妙的异步世界!你不能那样做;您需要使用回电或承诺。感谢@SLaks为您提供指导。现在,我在原始问题中添加了一个回调的示例。请参考测试用例3
。我现在正在获取数据,但我得到一个错误,告诉我调用done()。我不知道如何解决这个问题。也许我的方法是错误的。请提供帮助。您正在向只接受一个参数的函数传递两个参数。你以为那会怎么样?@SLaks,我完全被卡住了。我也尝试删除第二个参数。问题似乎出现在doCallback()
中,其中调用了request.get(…)
。正确的执行方法是什么?再次感谢。你好@SLaks,它可能与node有关吗?我正在使用节点v7.9.0
和请求JS v2.81.0
。我使用节点v6.9.0
和请求尝试了它(在删除mocha元素后)。get(…)
被正确调用。您应该返回承诺,而不是在it()
中使用完成
回调。而不是向回调传递一个混乱的额外参数,您应该使回调函数成为测试中的匿名函数,并直接调用done()
directly.hi@SLaks,done。为回调
示例添加了使用匿名函数的新测试用例。而且,对于Promise
示例,即使我返回,它仍然有效。请让我知道什么是正确的返回语句&以及为什么return-then
有效?非常感谢。返回则
无意义;您正在返回一个未定义的变量。您应该添加“使用严格”代码>以防止出现这种情况。您需要从测试方法中返回承诺本身;请参阅文档。您的错误回调也是错误的;你根本不应该这样。你的错误回调实际上没有做任何事情(你没有调用控制台.error
),你也没有理由这样做(你没有任何有意义的方法来处理错误)。如果您向测试运行程序返回失败的承诺,它将显示错误。您应该返回承诺,而不是使用it()
中的done
回调。而不是向回调传递令人困惑的额外参数,您应该使回调成为测试中的匿名函数,并调用done()
directly.hi@SLaks,完成。为回调
示例添加了使用匿名函数的新测试用例。而且,对于Promise
示例,即使我返回,它仍然有效。请让我知道什么是正确的返回语句&以及为什么return-then
有效?非常感谢。返回则
无意义;您正在返回一个未定义的变量。您应该添加“使用严格”代码>以防止出现这种情况。您需要从测试方法中返回承诺本身;请参阅文档。您的错误回调也是错误的;你根本不应该这样。你的错误回调实际上没有做任何事情(你没有调用控制台.error
),你也没有理由这样做(你没有任何有意义的方法来处理错误)。如果您向测试运行程序返回失败的承诺,它将显示错误。
var request = require('request');
describe('suite', function(){
it('Tase case 1', function(done){
var options = { url: 'http://www.google.com', headers: {'Content-Type': 'text/html'}};
request.get(options, function (err, res, body){
console.log("PRINT DATA: " + res.statusCode + ' ' + res.headers['content-type']);
//do some stuff here
done();
});
});
it('Test case 2', function(done){
console.log(get(done));
});
it('Test Case 3', function(){
doCallback(callbackHandler);
});
});
function get(done){
var options = {
url: 'http://www.google.com',
headers: {'Content-Type': 'text/html'},
encoding: null
};
request.get(options, function(err, res, body){
console.log("PRINT DATA: " + res.statusCode + ' ' + res.headers['content-type']);
//do some stuff here
return done(), res.headers['content-type'];
});
}
function callbackHandler(data) {
console.log("PRINT DATA: " + data.statusCode + ' ' + data.headers['content-type']);
}
function doCallback(done){
var options = {url: 'http://www.google.com', headers: {'Content-Type': 'text/html'}, encoding: null};
request.get(options, function(err, res, body){
var finalData = res;
return done(finalData);
});
}
var request = require('request');
describe('suite', function(){
it('Test Case 3', function(done){
doCallback(callbackHandler, done);
});
it('Test Case: 3A', function(done){
doCallback(function(data){
console.log("PRINT DATA: " + data.statusCode + ' ' + data.headers['content-type']);
done();
});
});
});
function callbackHandler(data, done) {
console.log("PRINT DATA: " + data.statusCode + ' ' + data.headers['content-type']);
done();
}
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){
return callback(res, done);
});
}
var request = require('request');
describe('suite', function () {
this.timeout(10000);
it('Test Case 3', function () {
return doCallback()
.then(function (res) {
console.log(res.statusCode + " " + res.headers['content-type']);
})
.catch(function(res){
console.log(res);
});
}); });
function doCallback() {
return new Promise(
function (resolve, reject) {
var options = { url: 'http://www.google.com', headers: { 'Content-Type': 'text/html' }, encoding: null };
request.get(options, function (err, res, body) {
if (err)
reject(err);
else
resolve(res);
});
}
); }