在Express路由中间件中使用可观察到的物件会导致标头发送后



我正在使用可观察的(特别是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.

相关内容

  • 没有找到相关文章

最新更新