【发布时间】:2022-12-09 02:52:27
【问题描述】:
我有一个像这样的普通 nodejs 服务器:
let someVar // to be set to a Promise
const getData = url => {
return new Promise((resolve, reject) => {
https.get(
url,
{ headers: { ...COMMON_REQUEST_HEADERS, 'X-Request-Time': '' + Date.now() } },
res => {
if (res.statusCode === 401) return reject(new RequestError(INVALID_KEY, res))
if (res.statusCode !== 200) return reject(new RequestError(BAD_REQUEST, res))
let json = ''
res.on('data', chunk => json += chunk)
res.on('end', () => {
try {
resolve(JSON.parse(json).data)
} catch (error) {
return reject(new RequestError(INVALID_RESPONSE, res, json))
}
})
}
).on('error', error => reject(new RequestError(FAILED, error)))
})
}
const aCallback = () =>
console.log('making api call')
someVar = getData('someApiEndpoint')
.then(data => { ... })
}
const main = () => {
const server = http.createServer(handleRequest)
anInterval = setInterval(aCallback, SOME_LENGTH_OF_TIME)
const exit = () => {
server.close(() => process.exit())
log('Server is closed')
}
process.on('SIGINT', exit)
process.on('SIGTERM', exit)
process.on('uncaughtException', (err, origin) => {
log(`Process caught unhandled exception ${err} ${origin}`, 'ERROR')
})
}
main()
我遇到了一种情况,我会 ctrl-c 并且会看到 Server is closed 日志,然后是我的命令提示符,但随后我会看到更多日志打印出来,表明正在进行更多 api 调用.
在exit()内调用clearInterval(anInterval)(在server.close()之前)似乎已经解决了即使服务器关闭时间隔仍在继续的问题,所以这很好。但:
来自这些节点docs:
关闭连接到此服务器的所有连接没有发送请求或等待响应.
也就是说,我假设
server.close()不会自动终止 http 请求。当我的计算机/节点不再跟踪变量
someVar时,http 响应信息会发生什么变化?没有专门杀死发出 http 请求(并正在等待响应)的线程的后果是什么?
是否有取消请求的最佳做法?
这包括什么(即我最终会告诉 API 的服务器“没关系,请不要发送任何东西”,或者我会指示节点不接收任何新信息)?
【问题讨论】: