优雅地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
,这是我所期望的
- 如何才能发送一个快速响应,直到asynchronous循环完成后?
- nodejs中的连续任务
- Express 4 + pm2手表不能正常工作
- SocketIO-GET http:// localhost:3000 / socket.io /?EIO = 3&transport = polling&t = 1418187395022-0 404(Not Found)
- NodeJSasynchronouscallback不完成&呈现把手模板
- Express sendfile()vs render()
- 如何使参数化的Express路线有或没有尾部反斜杠?
- 如何使用Express和Nodejs来保护静态路由
- 如何使用knex / Bookshelfselect数据库expression式作为值