Adwaysエンジニアブログスマートフォン用の表示で見るAdwaysエンジニアブログ2016-04-22Node.jsでWEBすくれいぴんぐ!(続編)Node.jsでWEBすくれいぴんぐ!(続編)コンニチワ、ワタナベデス。今回は前回の続きとなります。前回からしばらくJavaScriptでコードを書いていたのですが、Callback地獄に出くわしました。可読性も悪いし、何より書いていて楽しくない。Node.jsでは入出力を非同期的に扱うのが特徴なので、無名関数を使うとファイルを一つ開くだけでもネストが一段下がります。});});callbackhell.comなんていうCallback地獄について書かれたサイトもあるみたいです。何々・・・愛情を込めてCallback地獄と呼ばれている・・・オエッ。docker-seleniumBabel嘔吐失礼しました......。今回はそんなCallback地獄からの脱獄して前回のコードを見やすい形に修正していきます。次世代の規格をもとに書いたJavaScriptコードを、現在の規格のコードへと変換してくれるコンパイラーです。ES6で書かれたコードをES5に変換するなどができます。Functionsが使いたいからです。前記事余談でasync/awaitに簡単に触れましたが、これが本当に便利でCallbackを軒並み削ることができます。}}main();async/awaitはPromiseというデザインパターンを前提としているようです。Node.jsではPromiseオブジェクトとして導入されていますが、Node.jsのfsモジュールなどの多くがPromiseオブジェクトを返すようにできていないため、bluebirdというモジュールを使ってPromiseオブジェクトを返す関数を作成しています(readFileAsyncなどのAsyncが末尾につく関数)。Promiseの本(WEBサイト)に詳しく書かれているのでそちらを参照してみてください。今回は~/web_scrapingとします。使い始め当初は、Babelさえ入れれば大丈夫だと思い、変換したら変換前のものがそのまま出力されてきて驚きました。プラグインも一緒に入れましょう。Babelは.babelrcというファイルを作成することによって、どのプラグインを使用するかを決めます。~/web_scraping/.babelrcを以下の内容で作成します。]}ちなみに、async/awaitは記事投稿時点ではまだES.stage3です。策定完了stage4にならないと次世代の仕様には入らないらしいので、ES2017には入らないようです。スクレイピング以上の手順が終了したら前回の処理を少し書き換えてみます。今回、リファクタリングする上でいくつかハマってしまったところがあったので紹介します。data.toString();}console.log(getfile('/path/to/file'));上記のコードですが、getfile関数でファイルの内容が入ったdataをtoStringして返しています。普通の関数だったら戻り値として文字列であることが期待できますが、実際に帰ってくるのはPromiseオブジェクトです。゚д゚)ポカーンとなりますのでご注意を。console.log(data);}main();上の実験用のコードですがgetfile関数の中で例外を投げていますが、getfile関数を使用しているmain関数で例外をキャッチしていません。普通の関数だと例外が出力されますが、Async関数を使っている上のコードは実行すると音もなく(エラーなど何も出力されず)死にます。docker-selenium今回はSeleniumサーバーを動かすためにDockerを使用しました。Dockerは包み紙みたいにポイッと捨てられるのがいいですね。Dockerを使う理由としては、WEBブラウザを動かすためにSeleniumサーバーとHTTP通信してるだけなので、分離したほうが良さそうだったためです。|Dockerがインストールされていれば、コマンド一つでSeleniumサーバーを起動でき、ChromeやFirefoxなどの見知ったブラウザを動かすことができるようになるため便利です。前回紹介したXvfbも使う必要がありません。selenium/standalone-firefox:2.52.0CentOS6だとDockerが公式にサポートされてないようなので、CentOS7以降かUbuntuなどのほかのディストリビューションを使ったほうが良さそうです。今回はasync/awaitで前回のコードのリファクタリングを行いました。地獄から抜け出るとハッピーなJSライフが送れるので是非試して見てください。それでは、また次回よろしくお願いします~。Clientを使ってGitHubクライアントを作成してみたこんにちは、クリラボユニットの早津です。TypeScriptを試すこんにちは、@binarytaです。最近ちょくちょく噂を聞くHyperap...2018-06-29Puppeteerを使ったスクレイピングどうも、大曲です。3月から子会社から本社に戻ってきました。...2018-04-20ReactのContextAPIを使ってみたクリエイティブディビジョンからインプルーブメントディビジョ...2018-02-16Vue.jsの仮想DOMと差分レンダリングの仕組み3こんにちは、@binarytaです。(1)ABOUT株式会社アドウェイズのエンジニアによるブログです!このブログでは、アドウェイズのエンジニアがざっくばらんに技術のことや日常生活について書いていきますので、みなさんよろしくお願いいたします。アドウェイズ中途採用情報スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。