Skip to content

Instantly share code, notes, and snippets.

@hokaccha
Forked from shigeki/hello.js
Created November 22, 2012 02:44
Show Gist options
  • Save hokaccha/4129163 to your computer and use it in GitHub Desktop.
Save hokaccha/4129163 to your computer and use it in GitHub Desktop.
第1回Node.js入門勉強会 レポート課題
**課題1
なぜエラーが発生したのかその理由を記述しなさい。
server.close()を呼ぶとこれ以上のコネクションは受け付けなくなるが、
既存のコネクションに関してはそのまま接続された状態になる。
また、HTTPの接続はkeep-aliveで行われるため、明示的にコネクションを
終了させなければ接続がタイムアウトするまでコネクションは生きている。
最初のリクエスト(GET /)のときにserver.close()が呼ばれ、新規接続を
受け付けなくなるが、既存のコネクションは生きているので、その後favicon
へのリクエスト(GET /favicon.ico)は正常に発行され、再度server.close()
が呼ばれる。すでにcloseしているserverに対して再度close()が呼ばれるため
エラーが発生する。
server.close()が二度呼ばれてエラーになるというのはnet.jsのコードを
見ると確認できる(this._handleにnullが設定されるため)
https://github.com/joyent/node/blob/b00527fcf05c3d9fb5d5d790f9472906a59fe218/lib/net.js#L1043-L1054
**課題2
これを解決するには、まずconnectionイベントでserverをcloseする。これによって
最初のコネクション以降、新規コネクションを受け付けなくし、serverをcloseする。
また、リクエストがきた際、正常にレスポンスを返した後(reqのendイベント内で)
コネクションを終了させる(req.connection.end()を呼ぶ)。この切断処理を行わない
とkeep-aliveのタイムアウトが発生するまでプロセスが終了しない。
このgistのhello.jsが回答。
var http = require('http');
var server = http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
req.on('end', function() {
req.connection.end();
});
});
server.on('connection', function() {
server.close();
});
server.listen(8080, 0, function () {
console.log('Server running at http://localhost:8080/');
});
第1回の勉強会で重要だった点の一つは server.close() の挙動でした。
今回は、この server.close() の挙動についての課題です。
*課題
A君は、ブラウザで1回閲覧したら HelloWorld のWebサーバが終了するプログラムを作ろうと hello.js を作りました。
だけど Chrome でアクセスすると下のようなエラーになってしまい、プログラムが正常に終了しません。
**課題1
なぜエラーが発生したのかその理由を記述しなさい。
**課題2
このプログラムを修正してエラーが発生せずA君がやりたかったプログラムを作りなさい。
*提出方法
gist か ブログかに記載して、URLをメーリングリストに連絡してください。
*提出期限
次回勉強会開催まで。(その前に出そろえば答え合わせでもしましょうか)
````
> node hello.js
Server running at http://localhost:8080/
net.js:1046
throw new Error('Not running');
^
Error: Not running
at Server.close (net.js:1046:11)
at Server.<anonymous> (/home/ohtsu/hello.js:5:10)
at Server.EventEmitter.emit (events.js:99:17)
at HTTPParser.parser.onIncoming (http.js:1807:12)
at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:111:23)
at Socket.socket.ondata (http.js:1704:22)
at TCP.onread (net.js:403:27)
````
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment