如何使用jsdom从文件中获取DOM?

我正在使用Node.js,它的插件请求和FS来保存我的硬盘上的网页。 这是通过以下代码完成的:

function loadURL(url, file_path, handler) { request.get(url).on('error', (error) => handler(error)).pipe(fs.createWriteStream(file_path, {'flags' : 'w'})) } 

现在,我想通过Node.JS插件JSDOM从本地文件获取HTML DOM。

因此:

  1. 我必须阅读这个文件感谢插件FS;
  2. 当读取所有文件的HTML代码时,我必须将后者存储为一个string;
  3. 最后,我必须调用: jsdom.jsdom(the_string_containing_HTML_code)

步骤3很简单。 第二也许。 但是…我怎么能asynchronous读取本地文件使用FS? readfunction不应按照文件使用; 相反,我应该使用pipe …但后者只是将一个WritableStream到一个ReadableStream …它不能满足我想要的。

注意:我真的想要使用asynchronous方法。

对于你的用例(AFAIK), fs.readFile()是完全可以接受的。 该方法是asynchronous的。 同步和不明智的方法称为fs.readFileSync()。

我build议使用不处理stream的请求的调用,但只是返回一个数据的callback:

 function loadURL(url, file_path, handler) { request.get(url,(error,response,body) => { if (error) { handler(error,null); } fs.writeFile(file_path,body,'utf8',(err) => { if (err) { handler(err,null); } // now you can safely assume your file is written to disk // you still have $body in memory, but let's pretend you don't // for sake of this exersise fs.readFile(file_path,'utf8',(err,html) => { if (err) handler(err,null); jsdom.env(html,(err,window) => { if (err) handler(err,null); // SUCCESS! handler(null,window); }); }); }); }); } 

这将工作在低成本的工作量。 如果你想要更细致的控制stream,stream是好的。 但我build议先尝试这种方式。

这段代码假设handler()有签名handler(err,window)