【问题标题】:'Cannot set headers after they are sent to the client' after second request第二次请求后“无法设置标头后发送到客户端”
【发布时间】:2021-09-04 11:17:49
【问题描述】:

我使用 socket.io-client 和 express 制作了一个用作客户端的 Web 服务器(因为我必须在其他项目中使用此表单)。

它发出发布的字符串,当从 io 服务器接收到 'boom' 发出时,它通过发送服务的字符串来响应。

第一次发布“heat_bomb”效果很好,但是当我第二次尝试时,“[ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头”发生在 socket.on() 中的 res.send(data) .

有没有办法在post请求产生的时候刷新,让每个请求都使用独立的响应?

app.ts

import express from 'express'
import {io} from 'socket.io-client'
import bodyParser from 'body-parser'

const app=express()
const PORT=8080

const socket=io(`http://localhost:2002`, {
    query:{
        hello:"merhaba"
    }
})

app.use(bodyParser.urlencoded({extended:false}))

app.get('/', (req, res)=>{
    res.sendFile(__dirname+`/index.html`)
})
app.post('/heat_bomb', (req, res)=>{
    socket.emit('heat_bomb', req.body.elem)
    socket.on('boom', (data)=>{
        res.send(data)
    })
})

app.listen(PORT, ()=>{
    console.log(`Server Running: ${PORT}`)
})

index.html

$('#heat_button').click(function(){
    console.log('heating bomb')
    $.post('/heat_bomb', {elem: $('#input_number').val()},(data, status)=>{
        console.log(data)
        console.log('heated')
    })
})

【问题讨论】:

    标签: javascript express socket.io


    【解决方案1】:

    您的 /heat_bomb 中间件为同一全局定义的 socket 上的每个请求注册一个新的 boom 处理程序。尽管您的代码 sn-p 没有显示 heat_bombboom 事件是如何连接的,但我假设第二个请求期间的 emit('boom') 重新触发了在第一个请求期间注册的 heat_bomb 处理程序,导致来自第一个请求的res 的另一个res.send,该请求已经完成。这会导致观察到的错误消息。

    socket.once('boom') 单独无法可靠地解决这个问题:如果一个 heat_bomb 事件可以超越另一个,则第一个事件中的 data 可能会错误地与第二个事件中的 res“配对”。 res 需要作为事件的第二个参数,如下所示:

    socket.emit('heat_bomb', req.body.elem, res);
    socket.once('boom', function(data, res) {
      res.send(data);
    });
    

    【讨论】:

    • 自从我使用 socket.on 后,同一个处理程序又一直在注册。我将socket.on('boom') 更改为socket.once('boom'),以便处理程序在被调用后立即被删除。它有效!
    • @JonghyunPark,不确定这是否是一个可靠的解决方案,请参阅我编辑的答案。
    猜你喜欢
    • 2016-05-09
    • 2021-09-11
    • 2018-05-25
    • 2021-06-27
    • 2021-06-18
    • 2020-11-14
    • 2020-09-05
    • 2019-02-06
    相关资源
    最近更新 更多