【发布时间】:2019-05-31 14:11:20
【问题描述】:
如果这是一个模糊的问题,请告诉我,以便我指定。我真的很想绕过这个树桩。
我已经阅读了几份关于如何正确地将消息广播到客户房间的备忘单。我的参考是:https://github.com/socketio/socket.io/blob/master/docs/emit.md。
描述我的问题: 聊天页面正确显示了发送按钮,但是一旦我单击发送,就没有发送任何内容。
有趣的是,每当我不使用房间,而只使用默认命名空间时,我都可以收到消息。
知道发生了什么吗?谢谢!!
server.js
io.on('connection', function(socket) {
global.rooms = 'room1';
socket.on('subscribe', function(room) {
socket.join(rooms);
console.log(socket.id + 'joining room', rooms)
})
socket.on('chat', function(data) {
io.to(rooms).emit('chat', data);
})
})
chat.jade
extends layout
block content
h2.page-header Chat Page
div(id='the-chat')
div(id='chat-window')
div(id='output')
input(id='handle', type='text', value = user.name, style= 'width: 0px; visibility: hidden;')
input(id='message', type='text', placeholder='message')
button(id='send' value='Send') Send
//imports the socket.io functionality on the client side for the chat.jade application
script(src="/socket.io/socket.io.js")
script.
//variable created that mirrors connection made in the backend
//matches the connection made in the server side
var socket = io.connect('http://localhost:3000')
//Query dom
var message = document.getElementById('message')
var handle = document.getElementById('handle')
var btn = document.getElementById('send')
var output = document.getElementById('output')
//emit events
btn.addEventListener('click', function() {
socket.emit('chat', {
message: message.value,
handle: handle.value
})
})
socket.on('chat', function(data) {
output.innerHTML += '<p><strong>' + data.handle + ': </strong>' + data.message + '</p>';
document.getElementById('message').value = "";
})
Home.jade
extends layout
block content
h2.page-header(style = "text-align: center;").
Home Page
if (user.isTutor)
b(style = "text-align: center;")
form(method='post', action = '/home/available')
input.btn.btn-primary(type = 'submit',name='isAvailable', value = 'Available', id = 'button4')
form(method='post', action = '/home/unavailable')
input.btn.btn-primary(type = 'submit',name='isUnavailable', value = 'Unavailable', id = 'button5')
script(src="/socket.io/socket.io.js")
script.
var btn = document.getElementById('button4')
//var space = '#{user.room}'
var socket = io.connect()
btn.addEventListener('click', function() {
socket.emit('subscribe', 'room1')
})
div(id = 'magic')
form(method='get')
if (user.hasApplied)
input.btn.btn-primary(type = 'submit', onclick = "javascript: form.action = '/findatutor';" name='find', value = 'Find a Tutor', class = 'middle', id = 'button7')
else if (user.hasApplied == false)
input.btn.btn-primary(type = 'submit', onclick = "javascript: form.action = '/findatutor';" name='find', value = 'Find a Tutor', id = 'button1')
input.btn.btn-primary(type = 'submit', onclick = "javascript: form.action = '/apply';" name='become', value = 'Become a Tutor', id = 'button2')
Home.js
router.post('/available', ensureAuthenticated, (req,res,next) => {
var io = res.locals['socketio']
db.collection('DefaultUser').update({_id: req.user._id}, {$set: {isAvailable: true}});
res.redirect('../chat')
})
【问题讨论】:
-
那个房间里有没有人收到消息?我在 chat.jade 中没有看到您将“订阅”事件发送到服务器以便您加入房间的任何地方。那是在应用程序的不同区域发出事件吗?
-
事件发射器已包含在上面的 home.jade 按钮中。当用户单击 id = button4 的“可用”按钮时,应该会发生 2 件事。第一个:他们应该被重定向到 chat.jade 和第二个:他们应该为 room1 发出一个订阅事件。如果它有帮助,我会在服务器端 console.log(data) ,每次点击提交时都会得到正确的数据。问题是信息无法在客户端广播。这是 cmd 结果: { message: 'hi', handle: 'William Sheppard' } @JamesPooley
-
我还提供了 home.js 文件的 sn-p,其中包含对“可用”路由的发布请求,该路由表示将 (1) 重定向到聊天页面和 (2 ) 启动与 room1 的连接 @JamesPooley
-
请仔细检查我。当您从 home.jade 导航到 chat.jade 时,您不会断开连接并重新连接到套接字吗?据我所知,这将在服务器上创建一个新的套接字对象实例,这意味着新的套接字不会被订阅/在房间内,因为它是一个新的套接字实例。尝试通过在 chat.jade 脚本中向服务器发送订阅事件来进行测试,看看它是否以这种方式工作。 chat.jade
var socket = io.connect('http://localhost:3000') socket.on('connect', function () { socket.emit('subscribe', 'room1') })然后尝试聊天
标签: javascript node.js socket.io pug mean-stack