Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么每次运行node.js应用程序时,我的代码都会打印不合逻辑的模式?_Node.js_Redis_Socket.io_Publish Subscribe - Fatal编程技术网

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

为什么每次运行node.js应用程序时,我的代码都会打印不合逻辑的模式?,node.js,redis,socket.io,publish-subscribe,Node.js,Redis,Socket.io,Publish Subscribe,我正在使用node.js、redis、socket.io创建一个发布子应用程序 对于我的服务器端,这是我为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')

我正在使用node.js、redis、socket.io创建一个发布子应用程序

对于我的服务器端,这是我为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);
  });

在这里,当新消息到达时,它会附加到以前的消息中并导致问题。

这是一个近乎低质量的回答。我不会投票删除,但如果你能在帖子中添加更多内容,那就太好了。谢谢你的提及。我认为这很清楚,但你是对的。@Mohammadriahchamani这不是问题所在。即使我尝试使用console.log(msg),它仍然会重复多次。您将console.log放在append之前还是之后?而不是content.append