我正在尝试使用socket.io在我网站上的聊天模块中的用户之间发送消息。
消息运行正常,但是行为很奇怪,它来自我将socket.io的jquery文档翻译成javascript的方式。
第一个发送一次。 第二个很好。 第三两次。 第四三次。 等。
例如,如果我输入:foo, void, int, double
,则会显示:
foo
无效
无效
int
int
int
双
双
双
双
到目前为止,这是我的代码:
html
:
<form action="" [formGroup]="messageForm" (ngSubmit)="sendMessage()">
<input id="message" formControlName="message" #message class="form-control" class="messageInput" autocomplete="off"/>
<button type="submit" class="btn btn-primary btn-lg btn-block">SEND</button>
</form>
sendMessage() called from html
:
sendMessage() {
if (this.messageForm.valid) {
this.message = this.messageForm.get('message').value;
this.messageForm.reset();
this.socket.emit('chat message', this.message);
this.socket.on('chat message', this.receive);
}
}
receive = function(msg) {
console.log('receive called'); // called incrementally over time, 1, 22, 333 etc..
const li = document.createElement('li');
document.getElementById('messageList').appendChild(li);
li.innerHTML = msg;
};
backend
:
io.on('connection', function(socket){
socket.on('disconnect', function(){
});
socket.on('chat message', function(msg){
io.emit('chat message', msg);
});
});
Here is the socket.io tutorial code for reference
:
$(function () {
var socket = io();
$('form').submit(function(e){
e.preventDefault(); // prevents page reloading
socket.emit('chat message', $('#m').val());
$('#m').val('');
return false;
});
socket.on('chat message', function(msg){
$('#messages').append($('<li>').text(msg));
});
});
做完一些研究后,到处“ console.logging”看起来像receive()
被指数调用,一次是第一条消息,两次是第二条消息,依此类推。我相信我缺少对return false
从socket.io jquery的代码转换为我的Angular适配文件。
我该怎么办?
答案 0 :(得分:1)
知道了!
this.socket.on('chat message', this.receive);
不应位于sendMessage()
函数内。它位于套接字初始化中,只需声明一次即可:
try {
this.socket = io.connect('http://localhost:3000');
this.socket.on('chat message', this.receive);
} catch (e) {
console.log('Could not connect socket.io');
}