错误
Erreur : Impossible de définir les en-têtes après leur envoi.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:357:11)
at ServerResponse.header (D:\node\javascript-demo\node_modules\express\lib\response.js:730:10)
at ServerResponse.send (D:\node\javascript-demo\node_modules\express\lib\response.js:170:12)
at Timeout.setInterval [as _onTimeout] (D:\node\javascript-demo\routes\eventsource\eventsource.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 id="msg_recevie" 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>
Le problème a été résolu. Vous devez ajouter le préfixe "data:" et le suffixe "nn" aux données envoyées, c'est-à-dire "data"+msg+"nn"
Le code du serveur est modifié comme suit :
Question
Une fois la réponse express envoyée, la réponse n'est pas autorisée à effectuer une série d'opérations telles que l'en-tête Setintval est une minuterie et votre méthode logique n'est pas correcte.
.Votre setintval a poussé la réponse pour la première fois, donc la réponse suivante ne peut plus être utilisée puisque http est unidirectionnel mais pas bidirectionnel, la deuxième fois est une opération invalide
Solution
Si vous souhaitez que le client accepte le push d'événements du serveur, je vous recommande d'utiliser la rotation socketio ou ajax pour le gérer.