-
-
Save hokaccha/4129163 to your computer and use it in GitHub Desktop.
第1回Node.js入門勉強会 レポート課題
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
**課題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が回答。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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/'); | |
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
第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