即使在“结束”事件

时间:2017-01-19 14:43:28

标签: javascript node.js

基本上我试图从网站中删除一些数据,并在绑定到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的价值。

3 个答案:

答案 0 :(得分:1)

你的' var scraper'也在route.js文件中? 我想它不是,你无法访问其他js文件, 这样做使用module.exports。

例如

WITH sample_data AS (SELECT '1' col1 FROM dual UNION ALL
                     SELECT '12' col1 FROM dual UNION ALL
                     SELECT '123' col1 FROM dual UNION ALL
                     SELECT '1234' col1 FROM dual)
SELECT col1,
       CASE WHEN LENGTH(col1) = 1 THEN '000'||col1
            WHEN LENGTH(col1) = 2 THEN '00'||col1
            WHEN LENGTH(col1) = 3 THEN '0'||col1
            ELSE col1
       END new_col1
FROM   sample_data;

COL1 NEW_COL1
---- --------
1    0001
12   0012
123  0123
1234 1234

答案 1 :(得分:1)

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

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

有关详情,请参阅以下答案:

答案 2 :(得分:0)

最简单的修改方法是将回调函数传递给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);
    });
});