- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个简单的问题。我正在尝试关闭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秒,服务器立即关闭。因此,任何 future 的请求都应该被拒绝。然而,第二个请求仍然通过。控制台输出:
$> Express server listening on port 3000
received request
server closing
received request
如果您能解释一下发生了什么,我将不胜感激。
更新:
根据本杰明的回应,我尝试了他建议的测试代码,它按预期工作。问题出在浏览器中。我编辑了原始服务器:
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 周围的更改。当我运行本杰明建议的测试代码时,您会得到预期的输出:
$>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,“关闭”回调永远不会被调用。有点奇怪的行为。
感谢您的帮助。
最佳答案
express中的这个函数.close()
是基于.close
在 Node 中的 http 模块中,该模块基于 .close
在nodejs的net模块中。
让我们看看 API 怎么说。
Stops the server from accepting new connections and keeps existing connections. This function is asynchronous, the server is finally closed when all connections are ended and the server emits a 'close' event. Optionally, you can pass a callback to listen for the 'close' event.
这意味着您可能在同一个 Node 实例上运行测试代码,而 close
没有机会运行。
此外,setTimeout 并不准确,8000 毫秒的 setTimeout 可能会在 7980 毫秒的 8015 毫秒后触发。
当我运行以下代码以从不同 Node 程序测试您的代码时:
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
,这正是我所期望的
关于node.js - 优雅关闭 Node expressjs不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16698974/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!