Skip to content

Instantly share code, notes, and snippets.

@tokunami
Last active August 29, 2015 14:03
Show Gist options
  • Save tokunami/d931b07aa123a4ba7b6a to your computer and use it in GitHub Desktop.
Save tokunami/d931b07aa123a4ba7b6a to your computer and use it in GitHub Desktop.
requestモジュールを使ってhtmlを取得する

https://github.com/mikeal/request

  • npm でインストール
$ npm install request
  • app.jsの作成
var request = require('request');
var options = {
  url: 'http://www.google.com',
  json: true
};

request.get(options, function(error, response, body){
  if(!error && response.statusCode == 200) {
    console.log(body);
  } 
});
  • node で起動
$node app
  • ⇒googleのweb page(html)がconsoleに出力された。
とりあえずここまで。次のアクションは以下
  • bodyの中から何かを抜き出す
  • proxy処理
@tokunami
Copy link
Author

念願のproxy処理に成功しました!!(歓喜)

app.jsあらためclient.jsにしました。

var request = require('request');
var r = request.defaults({'proxy':'http://<proxyurl>:<port>'});
var options = {
  url: 'http://www.google.com',
  json: true
};

r.get(options, function(error, response, body){
  if(!error && response.statusCode == 200) {
    console.log(body);
  } 
});

簡単すぎてびっくりです。
コードリーディングしてみます。

@tokunami
Copy link
Author

もっとシンプルな方法

var request = require('request');
var r = request.defaults({'proxy':'http://<proxyurl>:<port>'});

url = 'http://google.com';

r(url, function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log(body);
  }
});

これでもちゃんと返ってくるけど、疑問あり

  • url は var つけなくていいのか?

@stoshiya
Copy link

urlをグローバル変数にする意図が無ければ,varつけたほうがいい.

@tokunami
Copy link
Author

Jacascriptの変数について調べてみました。

  • 変数の有効な範囲のことをスコープという
  • 変数の宣言されている位置によって、スコープの範囲が変わってくる
  • 関数の中で宣言されている変数を「ローカル変数」といい、スコープの範囲は「その関数の中」だけ
  • 関数の外側で宣言されている変数を「グローバル変数」といい、スコープの範囲は「プログラム全体」
  • varを省略する(暗黙的に宣言する)とその変数が自動的に「グローバル変数」となる

参考URLhttp://archiva.jp/web/javascript/variable_and_scope.html

@stoshiya
Copy link

CやJavaなどのプログラミング言語ではif, else, for, while などの制御文のなかは異なるスコープとなりますが,JavaScriptでは同一スコープとなります.JavaScriptでは変数へ再代入して破壊する(汚染する)危険性が高まるので要注意です.またJavaScript(ECMAScript5)には,他の言語のように変数に一度だけ値を入れることを制限する修飾子(Javaのfinal)がありません.

次のようなforループが複数ある疑似コードがあったとします.CやJavaではインデックス変数iやforループ内で宣言した変数がローカルスコープとなるため汚染を気にする必要はありませんが,JavaScriptだとiやforループの中で宣言した変数はforループを抜けたあとでも有効なので,一時的な変数としては使う場合にほかで変数名が衝突しないか配慮する必要があります.

var a = [1, 2, 3];
var b = [4, 5];

for (var i = 0; i < a.length; i++) {
  var foo = a[i];
}

for (var i = 0; i < b.length; i++) { // ここでiを再び宣言している.
}

// JavaScriptだとここでもiやfooが有効.

そこで,最近は極力Arrayの各種メソッドをつかうようにしています.プレディケート関数では別スコープとなるので,変数名の衝突問題から解放されます.

var array = [....]

array.forEach(function(element, i) {
  var foo = element;
  // foo, element, i はこの関数内でのみ有効.
});

console.log(foo, element, i) // いずれもundefined.

少し前はArray.forEach()などを使うと通常のforループに比べて数十パーセントもパフォーマンスが落ちるというデメリットもありましたが,JavaScriptの処理エンジン(V8)は常に改良されており,最近のNode.jsやブラウザでは大きな性能劣化はありません.プログラマが変数を汚染していないかなどに悩むくらいなら,関数スコープを活用してより本質的なところに頭を使うべきでしょう.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment