簡単な問題があります。現在のリクエストが応答を終了し、新しいリクエストが完全に拒否されるように、expressjs nodejs サーバーをシャットダウンしようとしています。理解しやすいように、コードを最小限の骨だけに絞り込みました。
express = require("express")
http = require("http")
app = express()
app.configure ->
app.set "port", process.env.PORT or 3000
app.use app.router
ran = false
app.get '/testrun', (req, res)->
console.log "received request"
if ran
res.json
shouldnt: 'have gotten here'
else
ran = true
setTimeout ->
res.json
response: 'fail!'
, 8000
console.log 'server closing'
server.close()
setTimeout ->
process.exit()
, 10000
server = http.createServer(app)
server.listen app.get("port"), ->
console.log "Express server listening on port " + app.get("port")
基本的に、私は 2 つの要求を行います。最初の 1 つは 8 秒かかり、サーバーはすぐに閉じられます。したがって、今後のリクエストは拒否する必要があります。ただし、2 番目の要求は引き続き通過します。コンソール出力:
$> Express server listening on port 3000
received request
server closing
received request
何が起こっているのか説明していただければ幸いです。
アップデート:
Benjamin の回答に従って、彼が提案したテスト コードを試してみたところ、期待どおりに動作しました。問題はブラウザにあります。元のサーバーを編集しました:
express = require("express")
http = require("http")
app = express()
app.configure ->
app.set "port", process.env.PORT or 3000
app.use app.router
ran = false
app.get '/testrun', (req, res)->
console.log "received request"
if ran
res.json
shouldnt: 'have gotten here'
else
ran = true
setTimeout ->
res.json
response: 'fail!'
, 5000
console.log 'server closing' # changes here
server.close ->
console.log 'closed!'
server = http.createServer(app)
server.listen app.get("port"), ->
console.log "Express server listening on port " + app.get("port")
server.close に関する変更に注意してください。Benjamin が提案したテスト コードを実行すると、期待どおりの出力が得られます。
$>Express server listening on port 3000
received request
server closing
closed!
しかし、Chrome で 2 つのタブを開き、最初のタブをリクエストし、数秒待ってから 2 番目のタブをリクエストすると、次の出力が得られます。
$>Express server listening on port 3000
received request
server closing
received request
また、process.exit がないと、「closed」コールバックが呼び出されることはありません。ちょっと変な振る舞い。
ご協力いただきありがとうございます。