即使在指定'结束'事件返回之后,NodeJS http.request也不会返回数据

基本上我试图从网站上http.request一些数据,并在绑定到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";
        }
    }
};

这里是Routes.js函数:

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

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


你的'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;

您不能从异步回调中返回值。 那么,你可以,但它很可能会被忽略,而且肯定不会做你想要的。

你甚至无法在那个地方回复承诺。 您现在只能使用return语句解决承诺。 您需要从主函数返回一个承诺,然后解决或拒绝您现在使用的返回事件处理程序中的承诺。

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

  • 在Nodejs中返回Promise结果而不是Promise
  • 从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);
        });
    });
    
    链接地址: http://www.djcxy.com/p/55377.html

    上一篇: NodeJS http.request not returning data even after specifying return on the 'end' event

    下一篇: NodeJS: Trouble scraping two URLs with promises