2016-12-03 24 views
1

私は、ハード・ディスクにWebページを保存するために、そのプラグインのRequestとFSというNode.jsを使用しています。これは、次のコードによって行われます:jsdomを使ってファイルからDOMを取得するには?

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

私は、このローカルファイルからJSDOMをプラグインのNode.jsのおかげでHTMLのDOMを取得するために、今、したいと思います。したがって

  1. 私はプラグインFSにこのファイルの感謝を読まなければなりません。
  2. ファイルのHTMLコードがすべて読み込まれると、後者を文字列に格納する必要があります。
  3. 最後に、jsdom.jsdom(the_string_containing_HTML_code)を呼び出す必要があります。

ステップ3は簡単です。おそらく2番目です。 しかし、どうすればFSを使ってローカルファイルを非同期で読むことができますか? read関数をドキュメントに従って使用しないでください。代わりにpipeを使用する必要があります...しかし、後者はにWritableStreamを添付しています...私が望んでいるものを満たしていません。

NB:私は本当に非同期メソッドを使いたいです。

答えて

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

はどうもありがとうございまし署名を持っています! –

関連する問題