向 socket.io node.js 中的房间发送消息

3

我正在尝试用node.js构建我的第一个应用程序——聊天工具。我在向相应房间发送消息时遇到问题。socket.room没有被存储,我认为这是因为我每次通过刷新页面来加载视图,而不是通过Ajax。请问使用此代码是否可能解决问题?

server.js

  var express = require('express')
        , http = require('http')
        , app = express()
        , server = http.createServer(app)
        , io = require('socket.io').listen(server)
        , path = require('path')
        , jade = require('jade');

app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.set("view options", {layout: false});
app.configure(function() {
    app.use(express.static(__dirname + '/public'));
});

app.get('/', function(req, res) {
    res.render('home.jade');
});

app.get("/rooms", function(req, res) {
    res.render('rooms.jade');
});
app.get("/music", function(req, res) {
    res.render('music.jade');
});
app.get("/art", function(req, res) {
    res.render('art.jade');
});


io.sockets.on('connection', function(socket) {

    socket.on('joinRoom', function(data) {
        console.log(data + ' joined');
        socket.room = data;
        socket.join(data);


    });

    socket.on('message', function(data) {

        io.sockets.in(socket.room).emit('sendMess', data.message);
    })


});


server.listen(3000);

client.js

    var socket = io.connect();

    $(document).ready(function() {

        $('.submit').on('click', function(e) {
            e.preventDefault();
            var user = $('.user').val();

            $.ajax({
                url: 'rooms'

            }).done(function(data) {
                $('body').html(data);
                console.log(user);
            })

        })

        $('#rooms').on('click', 'a', function() {

            var $this = $(this),
                    room = $this.data('name');
            joinRoom(room);

        });


        $('#conversation').find('.send').on('click', function() {
            var txt = $(this).prev('.message').val();
            console.log(txt);
            socket.emit('message', {message: txt});
        })


        socket.on('sendMess', function(data) {

            $('<p>' + data + '</p>').insertAfter($('#conversation'));


        })


    })




function joinRoom(data) {
    socket.emit('joinRoom', data);

}

home.jade

include header.jade
body
      div.container
         header
            h1 A Chat application 
            form(name="input", action="", method="post")
                | Username:
                input(type="text", name="user", class="user")
                input(type="submit", value="Login", class="submit")

rooms.jade

include header.jade
body
      div.container
         header
            h1 ROMS

         div#rooms
            h2 Join to room
            a(data-name='music', href='music') Music
            a(data-name='art', href='art') Art

music/art.jade

include header.jade
body
      div.container
         header
            h1 MUSIC ROOM

         div#rooms
            h2 Join to room
            a(data-name='music', href='music') Music
            a(data-name='art', href='art') Art


         div#conversation
            input(type="text", name="message", class="message")
            button(class="send") Send
1个回答

0

设置socket.room不会使其持久化,您必须自己存储它(例如:在数据库中)


但是,即使我像这样将房间存储为音乐 - socket.on('joinRoom', function(data) { console.log(data + ' joined'); socket.room = 'music'; socket.join('music'); });并且只发送消息到音乐房间 - io.sockets.in('music').emit('sendMess', data.message); 它仍然无效。我认为还有另一个问题。 - elevenMinutes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接