2016-12-03 49 views
1

我正在使用Node.js,其插件请求和FS将网页保存在我的硬盘上。这是通过下面的代码完成:如何使用jsdom从文件中获取DOM?

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代码时,我必须将后者存储为一个字符串;
  3. 最后,我必须致电:jsdom.jsdom(the_string_containing_HTML_code)

第3步是简单的事情。第二也许。 但是...我怎样才能使用FS异步读取本地文件?根据文件不应使用功能read;相反,我应该使用pipe ...但后者只是将WritableStream附加到ReadableStream ...它不符合我想要的。

注:我真的想用异步方法。

回答

1

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

我建议使用的request调用中不流处理,而是直接返回的数据的回调:

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

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

此代码假定处理器()具有签名handler(err,window)

+0

非常感谢您! –

相关问题