いろいろ備忘録

雑記です。

N HTTPサーバ ~21 覚書

nodegrind -o app.cpuprofile ファイル名 でパフォーマンスの測定を行い、結果出力を行う。出力されたファイルはChromeJavascript profileで読み込める。

echoのリダイレクト(閉じカッコ一つ)はファイルがない場合新規作成する。

 

git cloneで失敗する時 windows - いろいろ備忘録

node.jsのhttpモジュールにおいて、エラーはイベントで発生する。すなわち

http.createServer((req, res) => {
 
}).on('error', (e) => {
}).on('clientError', (e) => {
});

のように、イベントを処理する「on」で、errorイベントを処理することになる。

node index.js 2>&1 | tee -a tmp.log

  1. nodeがログを出力する
  2. 2>&1によって、エラー出力が標準出力になる。
    これがないと次のteeにエラー出力が渡せない。
  3. teeコマンドが標準入力を標準出力とファイルの両方に出力する。
  4. 結果、コンソールとファイルの両方に、info,warn,errorログの全てが出力される。

 curlコマンドでは、-d オプションでPOSTできる。
-d 'message=testMessage' のように、POSTするデータがkey = valueの形になることに注意。HTMLでformにnameが必要なことと同じ。

Node.jsのイベントループ - いろいろ備忘録

レスポンスをStreamのpipe(出力先)で返せる。ストリームなのでメモリが節約できる。入力側で出力側のend()を呼ぶため、res.end()がいらないが、pipe()のオプションで変更できる。

 

  const rs = fs.createReadStream("./form.html");
            rs.pipe(res);
            let i = 0;
            let fc = ()=>{
                if (++i > 2) {
                    rs.unpipe(res);
                    res.end();
                }else{
                setImmediate(fc);
                }
            };
            setImmediate(fc);

上記コードはイベントループごとにfcが実行され、4回目のイベントループでパイプを解除し、end()する。
イベントループ1回目 次のイベントループにfcを登録する i == undefined
イベントループ2回目 fcを実行し、fc内で次のイベントループにfcを登録 i==1
イベントループ3回目 同上 i==2
イベントループ4回目 fcを実行するが、i==3となるのでパイプ解除とend()する
肝となるのは、実行するとHTMLが何も返らないこと。
ストリームから最初のデータが送出される前にunpipe()されるため。
イベントループの制限を4回ではなく10回とかにすると中途半端なHTMLが返る。ストリームの途中でunpipe()されるため。
1000とかにすると、完全にストリームが出力し終わった後となるので、おそらく全てのHTMLが出力されている。

 

node.jsのBASIC認証に使うauth.basicの第二引数

(username, password, callback) => {
//このcallback()は引数で渡されている。アクセスを許可するかどうかのbool値を引数にとる。
//いつもは無名関数を渡す事が多いが、これはその逆バージョンになっている。
callback(username === 'guest' && password === 'xaXZJQmE');
}

 

BASIC認証BASE64エンコードしているだけなので盗聴されるとバレる。

BASIC認証では、401 Unauthorizedを返すことでログアウトが可能。

Cookieは毎回リクエストヘッダに挿入して送信されている。あまり肥大化するとサーバやネットワークに負荷がかかるため容量に制限がある。また、BASIC認証も毎回送信されている。HTTPはステートレスなため。

req.header.cookieは文字列。indexOf()やsplit()を使って目的のものを取り出す。

 

Anatomy of an HTTP Transaction | Node.js

 req.on('data',(chunk)=>{})のイベント「data」は、イベントループごとに送られてきたデータが存在する時実行されるが、断片的なものであっても実行されるので、大きなデータや低速で送られてくる場合、すなわち一回のイベントループで全てのデータが来なかった場合はこれだけでは処理が難しい場合がある。普通は、イベント「data」では受信したバイト配列をappend()していき、受信し終わったときにイベント「end」がemitされるので、それでconcat()してtoString()などする。