为什么我的代码每次运行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);
})
})
})
当我跑我的节点应用,这是我所得到的:
之后我插入首次一些输入,例如说:
后,我插入一些其他输入:
我不知道为什么这个错误是发生。
答
您正在将新消息附加到以前的消息。这是错误发生的地方!
var content = $('#content');
socket.emit('publish', msg, channelName);
socket.on('message', function(msg){
content.append(msg);
});
这里的时候,新邮件到达时,其附加到以前的消息而导致的问题。
这是一个临界的低质量答案。我不会投票删除,但如果您在帖子中添加了更多内容,这将是非常好的。 – gunr2171 2014-11-14 20:23:24
感谢您的提及。我认为这很清楚,但你是对的。 – 2014-11-14 20:26:34
@MohammadRahchamani这不是问题。即使我尝试使用console.log(msg),它仍然会多次执行 – Ralph 2014-11-14 20:32:29