如何访问Node.js';请求模块

如何访问Node.js';请求模块,node.js,request,web-scraping,cheerio,Node.js,Request,Web Scraping,Cheerio,有几个教程介绍了如何使用request和cheerio刮取网站。在这些教程中,他们将输出发送到控制台,或者使用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(im

有几个教程介绍了如何使用
request
cheerio
刮取网站。在这些教程中,他们将输出发送到控制台,或者使用
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
并从中获取信息,但这样做成本高昂且毫无意义。

一起移除管道

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
});

更新

根据您的评论,似乎您的请求函数正在按预期工作,但问题在于从另一个模块访问数据

我建议你读一下

这也是一个描述require和exports如何工作的示例

  • 将上面的代码放入模块中
  • 使用
    模块。导出
  • 需要另一个文件中的模块

您可以将请求包装在一个函数中,该函数将使用
html

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

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

输出为您在请求回调中的
html
。您不需要“发回”,而是在回调中处理它。我已经尝试过这个解决方案,但为了处理,我需要在执行期间无法访问的外部变量。是的,似乎我明白了这个想法。请参阅下面的答案。如果我这样做,我会得到一个未定义的
。如果你
控制台.log(img)
,你会得到src属性吗?是的,我会。但是,由于我对node.js相当陌生,我开始理解我真正的问题是:当我构建一个带有回调的模块,在另一个模块中需要它并使用它时,我如何从调用模块访问数据?如果像您的示例中那样返回数据,我总是会得到一个未定义的
。是的,您的问题似乎是
模块.exports在node.js中的工作方式。我用一些资源更新了我的答案。感谢您提供的信息和您对node.js noob的耐心!我去看看。RegardsI创建了模块,并在调用模块中需要它,并将输出记录到控制台。但现在我也有同样的问题。我开始理解,我通常不了解如何访问模块调用中的数据。返回数据或将其分配给全局变量并没有做到这一点!那么,将信息返回到全局范围的最佳方式是什么呢?一般来说,您应该等待所有异步任务结束,例如,对于请求,它应该首先对您请求的url执行一次往返,然后才有
正文
。如果在请求完成之前(将其理解为“请求回调函数之外”)尝试
console.log(body)
,则会得到
未定义的
。阅读一些关于节点中异步编程的教程。这是一个非常基本的概念,第一次很难理解,但是一旦你理解了它就很简单了。