2016-12-03 33 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

非常感謝您! –