html5 - EventSource报错
问题描述
错误
Error: Can’t set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:357:11)at ServerResponse.header (D:nodejavascript-demonode_modulesexpresslibresponse.js:730:10)at ServerResponse.send (D:nodejavascript-demonode_modulesexpresslibresponse.js:170:12)at Timeout.setInterval [as _onTimeout] (D:nodejavascript-demorouteseventsourceeventsource.js:8:8)at ontimeout (timers.js:384:18)at tryOnTimeout (timers.js:244:5)at Timer.listOnTimeout (timers.js:214:5) Program node --debug ./bin/www exited with code 1
const express = require(’express’);const router = express.Router();router.get(’/connect’,function(req,resp,next){ resp.append(’Content-Type’,’text/event-stream’); console.log(req.method); setInterval((data)=>{resp.send(’hello!’); },1000,’hello’);});router.get(’/html’,(req,resp,next)=>{ resp.render(’./eventsource/msgsend_recevie.html’);});module.exports=router;
<!DOCTYPE html><html lang='en'><head> <title>EventSource消息发送</title> <style type='text/css'>*{ margin:0 auto; padding:0;}p{ width:440px; height:450px; border:2px solid; margin-top:100px;}</style></head><body> <p><textarea rows='30' cols='60'></textarea> </p> <script>//使用eventsource发送信息var eventSource = new EventSource(’/msg_send/connect’);eventSource.onmessage=function(e){ var tx=document.getElementsByTagName(’textarea’)[0]; tx.value=e.data;}; </script></body> </html>
问题解答
回答1:问题已解决,需要给发送的数据加上'data:'前缀,'nn'后缀,即'data'+msg+'nn'服务端代码修改如下:
const express = require(’express’);const router = express.Router();router.get(’/connect’,function(req,resp,next){ resp.writeHead(200,{'Content-Type':'text/event-stream','Cache-Control':'no-cache','Connection':'keep-alive' }); setInterval(function(){ resp.write('data:'+Date.now()+'nn'); },1000);});router.get(’/html’,(req,resp,next)=>{ resp.render(’./eventsource/msgsend_recevie.html’);});module.exports=router;回答2:问题
在express的response已经send后,response不允许再进行header等一系列的操作,setintval是一个定时器,你的逻辑方式没有正确。你的setintval第一次已经把响应推送出去了,那么后面这个响应已经不能继续操作了,由于http是单向非双向的,所以第二次是无效的操作
解决方案如果你希望客户端能够接受服务端得事件推送的话,我推荐使用socketio,或者使用ajax轮训去处理。
相关文章:
1. docker容器呢SSH为什么连不通呢?2. 如何解决docker宿主机无法访问容器中的服务?3. docker 17.03 怎么配置 registry mirror ?4. android-studio - android app微信登录一定要申请了登录权限才能测试?5. css3 - div 水平垂直置中在safari不正常6. javascript - ios navgationTiming的responseStart > responseEnd? 会使什么原因造成的7. 实习过半年多Java开发,即将毕业,简历上的java项目写哪些比较有亮点的功能呢?能比较吸引技术面试审核简历的,相对于应届生来说8. angular.js使用$resource服务把数据存入mongodb的问题。9. javascript - 关于禁用文本选择与复制的问题10. javascript - nodejs使用require(’request’)模块发送数据,报错

网公网安备