【发布时间】:2017-09-18 11:51:35
【问题描述】:
我想用 nodeJS 和 socket.io 实时开发一个待办事项列表
我可以读取任务,但是在插入任务时,我有一个 POST 错误“无法发布/”但是服务器正确接收到任务,因为我可以在控制台日志中读取它并返回到本地主机,添加了任务...我认为我必须做错我的帖子,但我不知道如何正确地做。 这是我的代码
index.html:
<body>
<h1>Todo list temps réel !</h1>
<form action="/" method="post" id="formulaire_tache">
<input type="text" name="message" id="tache" placeholder="Votre tache..." size="50" autofocus />
<input type="submit" id="envoi_tache" value="Envoyer" />
</form>
<section id="zone_todo">
<ul>
</ul>
</section>
<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');
// On declenche l'evenement nouveau_client
socket.emit('nouveau_client');
socket.on('initTodo', function(todolist){
//On recupere les taches
console.log('Client');
todolist.forEach(function(tache, index){
$('#zone_todo').prepend('<li><a href="/todo/supprimer/' + index + '">✘</a>' + tache + '</li>');
})
})
// Lorsqu'on envoie le formulaire, on transmet le message et on l'affiche sur la page
$('#formulaire_tache').submit(function () {
var message = $('#tache').val();
socket.emit('ajout', message); // Transmet la tache au serveur
insereMessage(message); // Affiche la tache aussi sur notre page
$('#tache').val('').focus(); // Vide la zone et remet le focus dessus
return false; // Permet de bloquer l'envoi "classique" du formulaire
});
// Ajoute un message dans la page
function insereMessage(tache) {
$('#zone_todo').prepend('<li><a href="/todo/supprimer/' + index + '">✘</a>' + tache + '</li>');
}
</script>
</body>
我的 app.js
var app = require('express')(),
server = require('http').createServer(app),
io = require('socket.io').listen(server),
ent = require('ent'), // Permet de bloquer les caractères HTML (sécurité équivalente à htmlentities en PHP)
fs = require('fs');
var todolist = ['test', 'test2'];
app.get('/', function (req, res) {
res.sendFile(__dirname + '/index.html');
});
io.sockets.on('connection', function (socket) {
// Dès qu'on nous donne un pseudo, on le stocke en variable de session et on informe les autres personne
socket.on('nouveau_client', function() {
console.log(todolist);
socket.emit('initTodo', todolist);
});
// Dès qu'on reçoit un message, on récupère le pseudo de son auteur et on le transmet aux autres personnes
socket.on('ajout', function (tache) {
tache = ent.encode(tache);
todolist.push(tache);
console.log('tache ajouter ' + tache);
//socket.broadcast.emit('ajout', {tache: tache});
});
});
server.listen(8080);
还有我的控制台日志:
node app.js
[ 'test', 'test2' ]
tache ajouter azerty
[ 'test', 'test2', 'azerty' ]
感谢您的帮助
【问题讨论】:
-
我看不到您在服务器代码中的哪个位置收听帖子。根据代码,您似乎也没有发送帖子。应该防止表单提交。我的猜测是发生了 JS 错误,因此无法到达
return false。 -
你认为,我需要用 socket.IO 收听帖子吗?我在想不仅仅是为了快递?
-
不,我认为你不需要听帖子。这可能是另一个问题的征兆,因为它没有阻止表单提交。