NodeJS http.request не возвращает данные даже после указания возврата на событие "конец"

В основном я пытаюсь отказаться от некоторых данных с веб-сайта и выполнить извлечение, удаление и обновление DOM в функции обратного вызова, привязанной к событию "end" http.request.

Я также возвратил данные из обратного вызова события 'end', но он не получает в моей функции обратного вызова маршрута. Я получаю undefined там.

Ниже приведен код:

var scraper = {
    extractEmail: function (directoryName) {
        var result = getDirectory(directoryName);
        if (result !== 404) {
            var protocol = result.https ? https : http;
            protocol.request({
                host: 'somevalue.net',
                method: "GET"
            }, function (res) {
                var data = '';
                res.on('data', function (chunk) {
                    data += chunk;
                });

                res.on('end', function () {
                    return data;
                });
            })
                .on('error', function (err) {
                    return err;
                })
                .end();
            //return data;
        }
        else {
            //return "Failed";
        }
    }
};

И вот функция Routes.js:

app.get('/:directory', function (req, res) {
    var n = scraper.extractEmail(req.params.directory);
    console.log(n);
    res.send(n);
});

Здесь также я не получаю значение n.

Ответ 1

Является ли ваш "var scraper" также в файле route.js? Я думаю, это не так, и вы не можете получить доступ к этому другому js файлу, для этого используйте module.exports.

например.

// module.js
var name = "foobar";
// export it
exports.name = name; 



Then, in route.js...
>      //route.js
>      // get a reference to your required module
>      var myModule = require('./module'); 
>      //correct path to folder where your above file is
>      // name is a member of myModule due to the export above
>      var name = myModule.name;

Ответ 2

Вы не можете вернуть значение из асинхронного обратного вызова. Ну, вы можете, но это, скорее всего, проигнорируется и, безусловно, не будет делать то, что вы хотите.

Вы даже не можете вернуть обещание в этом месте. Вы можете решить только обещание, в котором теперь используются операторы return. Вам нужно вернуть обещание от основной функции, а затем разрешить или отклонить обещание в обработчиках событий, в которых вы теперь используете возврат.

Для получения дополнительной информации см. ответы:

Ответ 3

Простейшей модификацией, которая сделает эту работу, является передача функции обратного вызова extractEmail для получения данных после ее готовности.

var scraper = {
    extractEmail: function (directoryName, cb) {
        var result = getDirectory(directoryName);
        if (result !== 404) {
            var protocol = result.https ? https : http;
            protocol.request({
                host: 'somevalue.net',
                method: "GET"
            }, function (res) {
                var data = '';
                res.on('data', function (chunk) {
                    data += chunk;
                });

                res.on('end', function () {
                    cb(null, data);
                });
            })
                .on('error', function (err) {
                    cb(err);
                })
                .end();
        }
        else {
            cb(new Error('Failed'));
        }
    }
};

И используйте его следующим образом:

app.get('/:directory', function (req, res) {
    scraper.extractEmail(req.params.directory, function(err, n) {
        if (err) return console.error(err);
        console.log(n);
        res.send(n);
    });
});