recherche

Maison  >  Questions et réponses  >  le corps du texte

html5 - Erreur EventSource

错误

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>
    

phpcn_u1582phpcn_u15822764 Il y a quelques jours853

répondre à tous(2)je répondrai

  • 我想大声告诉你

    我想大声告诉你2017-05-31 10:41:06

    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 :

    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()+"\n\n");
        },1000);
    
    });
    
    
    router.get('/html',(req,resp,next)=>{
        resp.render('./eventsource/msgsend_recevie.html');
    });
    
    
    
    module.exports=router;

    répondre
    0
  • 给我你的怀抱

    给我你的怀抱2017-05-31 10:41:06

    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.

    répondre
    0
  • Annulerrépondre