我尝试用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>