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

问题描述:

我正在使用node.js,redis,socket.io创建pub-sub应用程序。为什么我的代码每次运行node.js应用程序时都会打印不合逻辑的模式?

对于我的服务器端,这是我的代码有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.

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

您正在将新消息附加到以前的消息。这是错误发生的地方!

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

这里的时候,新邮件到达时,其附加到以前的消息而导致的问题。

+1

这是一个临界的低质量答案。我不会投票删除,但如果您在帖子中添加了更多内容,这将是非常好的。 – gunr2171 2014-11-14 20:23:24

+0

感谢您的提及。我认为这很清楚,但你是对的。 – 2014-11-14 20:26:34

+0

@MohammadRahchamani这不是问题。即使我尝试使用console.log(msg),它仍然会多次执行 – Ralph 2014-11-14 20:32:29