【发布时间】:2018-09-22 03:02:40
【问题描述】:
var express = require('express');
var app = express();
var server = app.listen(3000);
var replyFromBot;
app.use(express.static('public'));
var socket = require('socket.io');
var io = socket(server);
io.sockets.on('connection' , newConnection);
function newConnection(socket) {
console.log(socket.id);
listen = true;
socket.on('Quest' ,reply);
function reply(data) {
replyFromBot = bot.reply("local-user", data);
console.log(socket.id+ " "+replyFromBot);
socket.emit('Ans' , replyFromBot);
}
}
我已经使用 node.js socket.io 和 express 创建了一个基于服务器的聊天机器人应用程序,但事情是我第一次调用 socket.on 时它被执行一次,第二次它被执行两次第三次三次等等我已经通过在我的客户端上设置一个标志来解决这个问题,以便它只显示一次。我只是想知道我的代码在逻辑上是否正确我的意思是这是一个好代码吗?因为如果客户第 10 次提出问题,那么 listeners 数组将有 10+9+8....+1 个听众,它会根据客户提出的问题数量继续增加。这不好
我尝试使用 removeListener,它只删除了一次侦听器,并且第二次回拨。你们有什么推荐的?我要这样做还是有其他方法可以在调用socket.on时添加侦听器并在执行时将其删除,并在下次调用时再次添加侦听器
谢谢。
客户端代码:
function reply() {
socket.emit('Quest' , Quest);
flag = true;
audio.play();
socket.on('Ans', function(replyFromBot) {
if(flag) {
console.log("hi");
var para = document.createElement("p2");
x = document.getElementById("MiddleBox");
para.appendChild(document.createTextNode(replyFromBot));
x.appendChild(para);
x.scrollTop = x.scrollHeight;
flag = false;
}
});
}
【问题讨论】:
-
目前尚不清楚您要实现的设计究竟是什么,所以我真的不明白问题是什么,或者您期望正确的行为是什么。您的代码似乎还使用了一些共享变量,例如
replyFromBot和listen,它们将在多个用户的请求之间共享,并且可能会导致问题。但是,我在此特定代码中看不到任何会导致重复事件处理程序的问题。客户端是否存在重复的处理程序? -
replyFromBot 和 listen 只是在另一个函数中使用的东西,它们不会引起任何问题,请忽略它们。
-
我想要实现的是用户将问题发送到服务器问题就像“data = Hi 你能帮我解决这个问题吗”,socket.emit('Quest', data); bot.reply 将搜索问题的适当答案,并以 socket.emit('Ans' , replyFromBot); 的形式回复客户端;
-
所以如果第一次问问题,那么我会得到一个答复,但是如果我第二次问它,我会得到相同的答复 2 次第三个问题会得到 3 个答复,依此类推
-
您在此处显示的服务器代码不会导致该问题。对于
'Quest'消息,每个套接字只有一个且只有一个服务器事件处理程序,并且每次收到传入消息时都发送一个'Ans'响应。我看不到您显示的代码如何导致您描述的问题,除非问题是在客户端引起的。也许我们需要查看客户端代码。