NodeJS, вызов функции не возвращается неопределенным даже после завершения

Здравствуйте: я новичок в nodejs и мокко. Я борюсь с возвращаемым значением из вызова функции. Он всегда возвращает 'undefined', хотя (я думаю) я использовал callback done() соответствующим образом.

В следующем примере, как я могу убедиться, что возвращаемое значение из get() всегда возвращает правильное значение, а не 'undefined'. В этой функции я использовал модуль requestJS, чтобы открыть google.com и вернуть тип контента. Тем не менее, в настоящее время он возвращает неопределенное.

Большое спасибо!

Обновлены сделанные посты обратной связи:

  • включены Test Case 3 пример, чтобы реализовать Callback, Результат: теперь я могу распечатать данные по желанию. Тем не менее, я получаю и сообщаю об ошибке, чтобы вызвать 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.
    ...

Google.js

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); 
    }); 
}

1 ответ

Одно из возможных решений (использование обратного вызова)

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);
            });
        }
    ); }
Другие вопросы по тегам