Node.js / socket.io,在刷新或新套接字连接时广播

时间:2014-11-22 12:38:45

标签: node.js sockets

我尝试用node.js和socket.io构建一个实时Todolist。 我的应用程序工作得很好,但有一个问题: 当新用户(套接字)建立连接或刷新页面时,内存中的任务(newtodo)将广播给所有用户。 我想我必须实现执行广播命令的条件,但我被阻止了。 你能帮我吗 ?

APP.JS

var app = require('express')(),
    server = require('http').createServer(app),
    io = require('socket.io').listen(server),
    cookieParser = require('cookie-parser'),
    session = require('cookie-session'),
    bodyParser = require('body-parser'),
    todoliste = [], // stocke la todolist
    newtodo ='',
    ent = require('ent'), // Permet de bloquer les caractères HTML (sécurité équivalente à htmlentities en PHP)
    fs = require('fs');

/* On utilise les cookies, les sessions et les formulaires */
app.use(cookieParser())
.use(session({secret: 'todotopsecret'}))
.use(bodyParser())
// S'il n'y a pas de todolist dans la session,
//on en crée une vide sous forme d'array avant la suite et
//permet de récuperer la liste
.use(function(req, res, next){
    if (todoliste.length != 0) {
        req.session.todolist = [];
        req.session.todolist = todoliste;
    }else{
        req.session.todolist = [];
    }
    next();
})

/* On affiche la todolist et le formulaire */
.get('/todo', function(req, res) {    

    res.render('todo.ejs', {todolist: todoliste,newtodo : newtodo});

})

/* On ajoute un élément à la todolist et le stoche dans newtodo*/
.post('/todo/ajouter/', function(req, res) {
    if (req.body.newtodo != '') {
        //req.session.todolist.push(req.body.newtodo);
        newtodo = req.body.newtodo;
        todoliste.push(newtodo);
        //req.body.newtodo = '';

    }
    res.redirect('/todo');
})

/* Supprime un élément de la todolist */
.get('/todo/supprimer/:id', function(req, res) {
    if (req.params.id != '') {
        req.session.todolist.splice(req.params.id, 1);
    }
    res.redirect('/todo');
})

/* On redirige vers la todolist si la page demandée n'est pas trouvée */
.use(function(req, res, next){
    res.redirect('/todo');
});


server.listen(8080);
/*on lance l'écoute sur la connexion d'un nouvel utilisateur*/
 io.sockets.on('connection', function (socket) {
                    console.log('client connecte');
                    // on envoie la tache à tout le mmonde

                       socket.broadcast.emit('newtodo',newtodo);

                });

INDEX.EJS

<!DOCTYPE html>

<html>
    <head>
        <title>Ma todolist</title>
        <style>
            a {text-decoration: none; color: black;}
        </style>
    </head>

    <body>
        <h1 id="h1">Ma todolist</h1>

        <ul id="ul">

        <% todolist.forEach(function(todo, index) { %>
            <li><a href="/todo/supprimer/<%= index %>">✘</a> <%= todo %></li>

        <% }); %>
        </ul>


        <div >

        </div>

        <form action="/todo/ajouter/" method="post" id="form">
            <p>
                <label for="newtodo">Que dois-je faire ?</label>
                <input type="text" name="newtodo" id="newtodo" autofocus />
                <input type="submit" id="submit" />
            </p>
        </form>

        <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
        <script src="/socket.io/socket.io.js"></script>
        <script>


            // Connexion à socket.io
            var socket = io.connect('http://localhost:8080');




                socket.on('newtodo', function(newtodo) {

                    if (newtodo != '') {
                        $('#ul').append('<li><a href="/todo/supprimer/">✘</a>'+ newtodo + '</li>');
                    }

                }); // Transmet le message aux autres



        </script>
    </body>
</html>

0 个答案:

没有答案