首页 > 解决方案 > 回调函数返回主函数的值

问题描述

我正在使用这个爬虫库来爬取特定页面并获取网站标题,为此我正在使用 express 和该库:

app.get('/crawler/', function(req, res){

var returnedTitle = crawlerTest(req.query.urlsite);
res.send({'title' : returnedtitle});
res.end();

});

function crawlerTest(urlsite){
var c = new Crawler({
    maxConnections : 10,
    // This will be called for each crawled page
    callback : function (error, res, done) {
        if(error){
            console.log(error);
        }else{
            var $ = res.$;
            // $ is Cheerio by default
            //a lean implementation of core jQuery designed specifically for the server
            console.log($("title").text());
        }
        done();
    }
});

// Queue just one URL, with default callback
c.queue(urlsite);
}

在上面的代码中,我使用了库本身的基本示例。

在这种情况下,该crawlerTest函数进入站点并可以提取页面标题。

但是有一个缺陷,我需要想办法将网站标题$("title").text()直接返回给crawlerTest函数,以便returnedTitle变量可以存储网站标题以发送响应res.send()

我知道我们应该总是done()为每个抓取的页面调用函数,但我想不出办法来做到这一点。

标签: node.js

解决方案


这工作我刚刚从 crawlerTest 函数返回了承诺。

app.get('/crawler/', async function(req, res){

    var returnedTitle =  await crawlerTest(req.query.urlsite);
    res.send({'title' : returnedtitle});
    res.end();

    });

    function crawlerTest(urlsite){
        return new Promise((resolve,reject)=>{
            var c = new Crawler({
                maxConnections : 10,
                // This will be called for each crawled page
                callback : function (error, res, done) {
                    if(error){
                        console.log(error);
                        reject(error);
                    }else{
                        var $ = res.$;
                        // $ is Cheerio by default
                        //a lean implementation of core jQuery designed specifically for the server
                        console.log($("title").text());
                        resolve($("title").text());
                    }
                    done();
                }
            });

            // Queue just one URL, with default callback
            c.queue(urlsite);
        });

    }

推荐阅读