每次运行node.js应用程序时,为什么我的代码会打印不合逻辑的模式?

时间:2014-11-14 19:44:46

标签: node.js redis socket.io publish-subscribe

我正在使用node.js,redis,socket.io。

创建一个pub-sub应用程序

对于我的服务器端,这是我对app.js的代码:

var express = require('express');
var app = express();
var redis = require('redis');
var http = require('http').Server(app);
var io = require('socket.io')(http);
var fs = require('fs');

app.use(express.static(__dirname + '/public'));
var port = process.env.PORT || 8000;

var sub = redis.createClient();
var pub = redis.createClient();

io.on('connection', function(socket){
socket.on('subscribe', function(channel){
sub.subscribe(channel);
console.log("Successfully subscribed");
});
socket.on('publish', function(msg, channel){
pub.publish(channel, msg);
if(pub.publish(channel, msg)){
  socket.emit('message', msg);
}
else{
  socket.emit('message', "The channel doesn't exist!");
  }
 })
})

http.listen(port, function(){
console.log('listening on port ' + port);
});

对于前端的index.js,我使用jquery来获取html元素并使用socket.io与服务器进行通信:

$(function(){
$("#sub-btn").click(function(){
var socket = new io.connect('http://localhost');
var channelName = $("#channel").val();
var content = $('#content');
socket.emit('subscribe', channelName);
})
$("#pub-btn").click(function(){
var socket = new io.connect('http://localhost');
var msg = $("#published_message").val();
var channelName = $("#channel").val();
var content = $('#content');
socket.emit('publish', msg, channelName);
socket.on('message', function(msg){
  content.append(msg);
  })
 })
})

当我运行我的节点应用程序时,这就是我得到的:

How it looks before entering anything

我第一次插入一些输入后,比如说:

it works correctly

我插入一些其他输入后:

It starts printing multiple times.

我不知道为什么会发生这个错误。

1 个答案:

答案 0 :(得分:0)

您要向之前的消息追加新消息。这就是bug发生的地方!

var content = $('#content');
socket.emit('publish', msg, channelName);
socket.on('message', function(msg){
  content.append(msg);
  });

此处,当新邮件到达时,它会附加到之前的邮件并导致问题。