我正在使用可观察的(特别是RXHTTP)。我还将连接时间段用于超时运行请求。不幸的是,即使击中了错误处理中间件,也应表面上关闭连接。
,我的.subscribe
似乎仍在运行。
这通常会导致A:
Error: Can't set headers after they are sent.
最小可重复的情况下方。
'use strict'
const express = require('express')
const timeout = require('connect-timeout')
const Rx = require('rx')
const http = require('http')
let app = express()
app.use(timeout('1s'))
app.get('/', (req, res) => {
//in the real application the Rx is an external request
return Rx.Observable.create((observer) => {
observer.onNext({
response: 'potato'
})
observer.onCompleted()
})
.delay(new Date(Date.now() + 1500))
.subscribe((x) => {
console.log('this runs')
res.status(200).send()
}, (e) => {
console.log('this does not')
})
})
app.use((err, req, res, next) => {
if(err) {
res.status(500).send('SOMETHING BROKE!')
}
})
const httpServer = http.createServer(app)
httpServer.listen(3000, function () {
console.log('Listening on port %d.', 3000)
})
我如何避免这个问题?为什么即使中间件已计时,.subscribe
仍在运行?我知道我可以通过在可观察到的可观察到的.timeout
链接来避免这种情况,但是这有一个缺陷,它不一定与连接超时相对应(例如,数据库读取可能发生了,汇总的请求可能需要超过一秒钟以上,虽然可观察到的本身不是)。有一个更通用的解决方案吗?
Connection-timeout
npm这样的工作。
delay()
功能延迟了响应,尽可能多。在这种情况下,响应延迟了1.5秒。因此,客户在1.5秒通过之前才能得到响应。
app.use(timeout('1s'))
函数检查是否在收到请求后发送响应是否已发送,在这种情况下,响应直到1.5秒之前才发送,因此即使以后发送了响应,它也会返回错误。p>我的代码,我的服务器在5秒钟后检查是否发送,如果不是响应,则会返回错误。
'use strict'
const express = require('express')
const timeout = require('connect-timeout')
const Rx = require('rx')
const http = require('http')
let app = express()
app.use(timeout('5s')); // if can't send the response in 5 seconds, it will return request timeout error
app.get('/', (req, res) => {
//in the real application the Rx is an external request
Rx.Observable.create((observer) => {
observer.onNext({
response: 'potato'
})
observer.onCompleted()
})
.delay(new Date(Date.now() + 1000)) // I am delaying the requests 1 seconds
.subscribe((x) => {
console.log(x);
console.log('this runs')
res.status(200).send()
}, (e) => {
console.log('this does not')
})
})
app.use((err, req, res, next) => {
if(err) {
console.log(err);
res.status(500).send('SOMETHING BROKE!')
}
})
const httpServer = http.createServer(app)
httpServer.listen(3000, function () {
console.log('Listening on port %d.', 3000)
})
因此,我的服务器的响应将在收到请求后一秒钟发送,并且服务器将检查是否在5秒后发送,如果不是,它将返回Service Unavailable: Request Timeout.