【问题标题】:How to access output from Node.js' request module如何访问 Node.js 请求模块的输出
【发布时间】:2014-04-24 07:54:58
【问题描述】:

有几个教程描述了如何使用 requestcheerio 抓取网站。在这些教程中,他们将输出发送到控制台或将带有 fs 的 DOM 流式传输到文件中,如下例所示。

request(link, function (err, resp, html) {
  if (err) return console.error(err)
  var $ = cheerio.load(html),
      img = $('#img_wrapper').data('src');
  console.log(img);
}).pipe(fs.createWriteStream('img_link.txt'));

但是如果我想在脚本执行期间处理输出怎么办?如何访问输出或将其发送回调用函数?当然,我可以加载 img_link.txt 并从那里获取信息,但这会很昂贵且没有意义。

【问题讨论】:

  • 输出是 html 你在请求回调中。您不需要“发回”,而是在回调内部处理它。
  • 我已经尝试过这个解决方案,但是为了处理我需要在执行期间无法访问的外部变量。
  • 是的,看来我明白了。请参阅下面的答案。

标签: node.js request web-scraping cheerio


【解决方案1】:

您可以将请求包装在一个将使用html 回调的函数中

function(link, callback){
  request(link, function(err, im, body){
    callback(err, body);
  });
});

然后将其分配给exports 并在任何其他模块中使用。

【讨论】:

  • 我创建了模块并在调用模块中需要它,并将输出记录到控制台。但现在我有同样的问题。我开始明白,我普遍缺乏理解如何访问模块调用中的数据。返回数据或将其分配给全局变量并没有成功!那么让信息回到全局范围的最佳方法是什么?
  • 一般来说,你应该等待所有异步任务结束,例如有了请求,它应该首先对您请求的 url 进行一次往返,只有在那次旅行之后,您才会拥有body。如果您之前尝试console.log(body)(将其读作“请求回调函数之外”)请求完成,您将获得undefined。阅读一些关于 Node.js 异步编程的教程。这是一个非常基本的概念,第一次很难理解,但一旦理解就非常简单。
【解决方案2】:

把管子一起拔掉。

request(link, function (err, resp, html) {
  if (err) return console.error(err)

  var $ = cheerio.load(html);
  var img = $('#img_wrapper').data('src'); // the var img now has the src attr of some image

  return img; // Will return the src attr
});

更新

在您的 cmets 看来,您的请求功能似乎按预期工作,但问题在于从另一个模块访问数据。

我建议你阅读这个Purpose of Node.js module.exports and how you use it

这也是一个good resource article,描述了 requireexports 是如何工作的。

  • 将上面的代码放在一个模块中
  • 使用module.exports
  • 需要另一个文件中的模块

【讨论】:

  • 如果我这样做,我会得到一个undefined
  • 如果你console.log(img),你得到src attr吗?
  • 是的,我愿意。但是由于我对 node.js 还很陌生,我开始了解我真正的问题是:当我构建一个带有回调的模块时,在另一个模块中要求它并使用它,我将如何从调用模块访问数据?如果我只是按照您的示例返回数据,我总是会得到一个undefined
  • 是的,看起来您的问题是 module.exports 在 node.js 中的工作方式。我用一些资源更新了我的答案。
  • 感谢您提供的信息和您对 node.js 菜鸟的耐心!我会看看。问候
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
  • 2013-05-05
  • 2018-01-05
相关资源
最近更新 更多