第二次请求后"在将标头发送到客户端后无法设置标头"



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

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

发布"heat_omb"第一次运行良好,但当我尝试第二次时,"[ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头"发生在socket.on()中的res.send(data)处。

是否有一种方法可以在生成后请求时进行刷新,以便每个请求都使用独立的响应?

应用

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')
})
})

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

单独的socket.once('boom')不能可靠地解决这个问题:如果一个heat_bomb事件可以超过另一个,则第一个事件的data可能错误地为"0";成对的";其中CCD_ 13从第二个开始。res需要成为事件的第二个自变量,类似于以下内容:

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

最新更新