NodeJS http.request 即使在'end'事件上指定返回后也不返回数据



>基本上,我正在尝试从网站中抓取一些数据,并对绑定到http.request的"end"事件的回调函数执行DOM提取,删除和更新。

我也从'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";
        }
    }
};

这是路由.js函数:

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

在这里我也没有得到n的价值.

您的"var 刮板"是否也在路由.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;

不能从异步回调返回值。好吧,你可以,但它很可能会被忽略,而且肯定不会做你想做的事。

你甚至不能在那个地方回报承诺。您只能在现在使用 return 语句的情况下解析承诺。您需要从 main 函数返回一个承诺,然后在现在使用 return 的事件处理程序中解析或拒绝该承诺。

有关更多信息,请参阅以下答案:

  • 在 Nodejs 中返回承诺结果而不是承诺
  • 从 promise 块返回函数中的值
  • jQuery:在 ajax 调用成功后返回数据

使这项工作最简单的修改是将回调函数传递给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);
    });
});

最新更新