使用请求NPM包返回带有嵌套函数的值

return value with nested function using the request NPM package

本文关键字:嵌套 函数 返回 请求 NPM 包返回      更新时间:2023-12-20

我正在抓取ghost博客平台,我使用的包是请求,但我不知道如何返回嵌套请求的值。我指出了引起这个问题的地方。谢谢

    var express = require('express');
    var fs = require('fs');
    var request = require('request');
    var cheerio = require('cheerio');
    var app     = express();
    app.get('/', function(req, res){
    var url = 'http://<subdomain>.ghost.io';
    var articles = [];
    request(url, function(error, response, html){
        if(!error){
            var $ = cheerio.load(html);
            var post;
            $('article').each(function(index) {
                var self = $(this);
                var article = {
                    header : self.find('h2.post-title').text(),
                    route: url + self.find('h2.post-title a').attr('href'),
                    content : '',
                    author: self.find('footer a').text(),
                    timestamp : self.find('time.post-date').text()
                };
                request(article.route, function(error, response, html) {
                    $ = cheerio.load(html);
                    post = $('section.post-content').text();
                    return post; //*** this is what I can't return ***//
                    //*** I'd like it to be the value of article.content ***//
                });
                console.log(post); //*** undefined ***//
                articles.push(article);
            });
            fs.writeFile('posts.json', JSON.stringify(articles, null, 4), function(err){
                console.log('Posts created.');
            });
        }
    });
})

app.listen('8000');
console.log('Watching for changes.');
exports = module.exports = app;

因此,您的问题归结为拥有一个URL列表,并且希望(异步地,因为node.js)请求所有URL,然后知道它们何时全部完成,然后对收集到的结果采取措施。

async模块(npm install async)将允许您这样做:

var request = require('request');
var async = require('async');
var urls = ["http://google.com", "http://yahoo.com"];
async.map(urls, request, function(err, results) {
    // First 100 characters of http://google.com
    console.log(results[0].body.substr(0, 100));
    // First 100 characters of http://yahoo.com
    console.log(results[1].body.substr(0, 100));
});

因此,您可以通过以下操作将其应用于您的问题:

  1. 同步创建整个articles列表
  2. 使用列表中的async.map
  3. 在对async.map的回调中,您有一个所有响应的列表;您可以同步处理它们