Javascript Socket.io不使用Socket.on添加消息
我正在尝试使用socket.io创建实时聊天。除了别人发布新消息时自动更新外,我的一切都正常。我相信我的io.sockets.emit&socket.on('message',getMessages())有问题 我尝试了各种发射和套接字的组合。我使用的是express 4.16.4和socket.io 2.2.0 这是我的index.jsJavascript Socket.io不使用Socket.on添加消息,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,我正在尝试使用socket.io创建实时聊天。除了别人发布新消息时自动更新外,我的一切都正常。我相信我的io.sockets.emit&socket.on('message',getMessages())有问题 我尝试了各种发射和套接字的组合。我使用的是express 4.16.4和socket.io 2.2.0 这是我的index.js var express = require('express'); var router = express.Router(); var app = expr
var express = require('express');
var router = express.Router();
var app = express();
const server = require('http').createServer(app);
const io = require('socket.io')(server);
//Render Chat
router.get('/Chat', function(req, res, next) {
ChatData.find({},(err, messages)=> {
var chatmessages = messages;
res.render('Chat', {messages: chatmessages, csrfvalid: req.session.csrf, csrfToken: req.csrfToken(), loginerrors: req.session.loginerrors, success: req.session.success, errors: req.session.errors, user: req.session.user });
req.session.errors = null;
req.session.loginerrors = null;
req.session.csrfvalid = null;
})
});
//GET Messages
router.get('/messages', (req, res) => {
ChatData.find({},(err, messages)=> {
res.send(messages);
})
})
//POST chat
router.post('/chat', function(req, res, next) {
var item = {
name: req.body.name,
message: req.body.message
};
var data = new ChatData(item);
data.save(function(err) {
if(err){
console.log(err);
return;
}
io.sockets.emit("message", req.body);
res.send({});
})
});
这是我的聊天客户端javascript
<script>
var socket = io('http://MY_IP:3000', { transport : ['websocket'] });
$(() => {
$("#send").click(()=>{
sendMessage({name: $("#name").val(), message: $("#message").val(), _csrf: $("#csrf").val()});
document.getElementById('name').value = "";
document.getElementById('message').value = "";
})
//getMessages()
})
socket.on('message', getMessages());
function addMessages(message){
$("#messages").append('<b>', message.name, '</b> : ' , message.message,' <a href="delete?_id='+message._id+'">Delete</a><br><br>')
}
function getMessages(){
$.get('http://MY_IP:3000/messages', (data) => {
data.forEach(addMessages);
})
}
function sendMessage(message){
$.post('http://MY_IP:3000/chat', message)
}
</script>
将该函数指定为客户端套接字的处理程序时,您似乎正在调用
getMessages()
:
/* This is incorrect, as you're calling getMessages() immediately,
rather than specifying it as a function handler to be called when
the "message" event occurs */
socket.on('message', getMessages());
从该行的getMessages()
中删除()
,应该可以解决问题:
/* Corrected code */
socket.on('message', getMessages);
/* Add another call to getMessages() to fetch messages automatically on start */
getMessages()
为了确保在客户端应用程序启动时自动获取消息,您可以在
socket.on(…)
上直接添加对getMessages()
的第二次调用,如上所示。在客户端代码中尝试此修改
function getMessages(){
$.get('http://MY_IP:3000/messages', (data) => {
$.each(data,(i,v)=>{
addMessages(v)
})
})
}
我尝试了这个,然后没有消息出现。因此,我取消了上面getMessages()的注释,出现了消息,但新消息没有出现。不过,我刚才看到的示例没有()所以我认为你是对的,但它仍然不起作用。@matt这很有意义-只是更新了答案。那有用吗?对不起,我一点也不清楚。我删除了括号,然后放了一个getMessages(),以便自动获取消息。保存的消息显示正常,但新消息在重新加载页面之前不会显示。我被难住了…你能验证你的服务器代码是否达到这一行吗<代码>io.sockets.emit(“消息”,请求正文)代码>是的,我在它旁边放了一个控制台日志,它完全启动了。我做了更改,但同样的事情正在发生,消息将发布,但不会出现,除非我重新加载页面。getMessages函数以前是工作的,因为页面在加载时也是这样填充消息的。我认为问题仍然在于emit,当其他人发布聊天时,它不会再次触发getMessages。
function getMessages(){
$.get('http://MY_IP:3000/messages', (data) => {
$.each(data,(i,v)=>{
addMessages(v)
})
})
}