优雅地closures节点expressjs不起作用

我有一个简单的问题。 我试图closures一个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") 

所以本质上,我提出了两个要求。 第一个需要8秒,服务器立即closures。 所以任何未来的请求都应该被拒绝。 然而,第二个要求仍然能够通过。 控制台输出:

 $> Express server listening on port 3000 received request server closing received request 

如果你能解释发生了什么,我将不胜感激。

更新:

根据本杰明的回答,我尝试了他build议的testing代码,并且按预期工作。 问题出在浏览器中 。 我编辑了原始的服务器:

 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周围的更改。 当我运行Benjaminbuild议的testing代码时,你会得到预期的输出:

 $>Express server listening on port 3000 received request server closing closed! 

但是当我在chrome中打开两个标签时,请求第一个,等待几秒钟,然后请求第二个,我得到这个输出:

 $>Express server listening on port 3000 received request server closing received request 

如果没有process.exit,那么“closed”callback就不会被调用 。 有点怪异的行为。

谢谢你的帮助。

这个函数中的.close()函数是基于.close ,基于nodejs中net模块的.close节点中的http模块。

让我们来看看API所说的。

阻止服务器接受新连接并保持现有连接。 这个函数是asynchronous的 ,当所有的连接都结束并且服务器发出'close'事件时,服务器终于closures了。 或者,您可以传递callback以收听“closures”事件。

这意味着你可能在节点的同一个实例上运行testing代码, close没有机会运行。

此外,setTimeout不准确,可能会有8000毫秒的setTimeout在7915毫秒的8015毫秒后触发。

当我运行以下代码从另一个节点程序testing您的代码时:

 http = require("http") http.get "http://localhost:3000/testrun" setTimeout http.get.bind(http,"http://localhost:3000/testrun"), 8000 setTimeout http.get.bind(http,"http://localhost:3000/testrun"), 9000 

我明白了

 $ coffee test.coffee Express server listening on port 3000 received request server closing 

运行客户端的其他窗口抛出ECONNREFUSED ,这是我所期望的