2014-11-14 41 views
0

我正在使用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.

我不知道爲什麼這個錯誤是發生。

回答

0

您正在將新消息附加到以前的消息。這是錯誤發生的地方!

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

相關問題