gpt4 book ai didi

node.js - 优雅关闭 Node expressjs不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 23:44:16 26 4
gpt4 key购买 nike

我有一个简单的问题。我正在尝试关闭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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com