【问题标题】:How do I render a new jade view upon a socket event?如何在套接字事件上呈现新的翡翠视图?
【发布时间】:2016-06-06 22:49:56
【问题描述】:

我有两个主要的 js 文件,一个在服务器端,即server.js,另一个在客户端,即enterchat.js。这两个文件将通过 socket.io 进行通信。所有套接字事件都按预期工作。

server.js

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

var usernames = [],
    username_sockets = [];

...

app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use('/', express.static(__dirname+'/public/'));

app.get('/chat', function (req, res) {
    res.render('checkUsername', {title:'Socket IO Chat'});
});

app.get('/chatwindow', function (req, res) {
    res.render('chatwindow', {title:'Welcome to chat window'});
});

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

    socket.on('disconnect', function () {
        ...
        delete username_sockets[socket.id];
        console.log("Disconnected from " + user);
    });

    socket.on('newusr', function (newusrname) {
        console.log("New user name request:: " + newusrname);
        if(usernames.indexOf(newusrname) >= 0)
        {
            console.log("Already used username..");
            socket.emit('usernameTaken', newusrname);
        }
        else
        {
            socket.emit('usernameavlbl', newusrname);
        }
    });

    socket.on('startchat', function (usernameAvailable) {
        if(usernames.indexOf(usernameAvailable) >= 0)
        {
            console.log("Just taken username..");
            socket.emit('usernameJustTaken', usernameAvailable);    //returning the username that was just taken
        }
        else
        {
            usernames.push(usernameAvailable);
            console.log("Opening chat window for "+usernameAvailable);
            username_sockets[socket.id] = usernameAvailable;

            //  trying to render jade view to open chatwindow on socket event
        }
    });

    socket.on('sndmsg', function (message) {
        socket.broadcast.emit('msgreceive', message, username_sockets[socket.id]);
    });

    socket.on('typing', function (username) {
        socket.broadcast.emit('usertyping', username);
    });

    socket.on('stoppedtyping', function (username) {
        socket.broadcast.emit('userstoppedtyping', username);
    });
});

server.listen(8080,'0.0.0.0');
console.log("Listening on 8080..");

enterchat.js

var socket, usernameAvailable;

    $(document).ready(function () {
        connect();

    ...

    ...

    $('#checkBtn').on('click', function(event) {
        if($('#username').val() == '')
            alert("Choose a username");
        else
        {
            var newusrname = $('#username').val();
            socket.emit('newusr', newusrname); 
        }
    });

    ...

    socket.on('usernameTaken', function (message) {
        alert(message + " is already taken. Try another one..");
    });

    socket.on('usernameJustTaken', function (message) {
        alert(message + " was just taken. Try another one..");
    });

    socket.on('usernameavlbl', function (newusrname) {
        $('#chataway').attr('disabled', false);
        usernameAvailable = newusrname;
    });

    $('#chataway').on('click', function () {
        socket.emit('startchat', usernameAvailable);
    });
    });

    function connect () {
        socket = io.connect(null);
    }

我的问题:如何在套接字事件startchat 上呈现chatwindow 视图?

我看了这个问题:In Express.js, how can I render a Jade partial-view without a "response" object?,但我不确定如何在我的代码中添加它,以便在浏览器上加载一个新的翡翠视图(聊天窗口)。

【问题讨论】:

    标签: javascript node.js express socket.io pug


    【解决方案1】:

    您可以使用jade api 的compileFile 方法,获取html,然后发出包含html 数据的套接字事件。您可以将该 html 附加到 DOM。

    socket.on('startchat', function (usernameAvailable) {
        if(usernames.indexOf(usernameAvailable) >= 0)
        {
            console.log("Just taken username..");
            socket.emit('usernameJustTaken', usernameAvailable);    //returning the username that was just taken
        }
        else
        {
            usernames.push(usernameAvailable);
            console.log("Opening chat window for "+usernameAvailable);
            username_sockets[socket.id] = usernameAvailable;
    
            var fn = jade.compileFile('path to jade file', options);
    
            // Render function
            var html = fn();
    
            // Now you can send this html to the client by emitting a socket event
    
        }
    });
    

    【讨论】:

    • 嗨.. 感谢您的回复。是的,发出渲染的 HTML 效果很好。但这会打开一个新连接(使用新的socket.id),让旧连接保持活力。我使用socket.id 来存储用户名,这意味着我将无法在server.js 中使用username_sockets[socket.id] = usernameAvailable;。因为它是一个new socket.id,所以我得到undefined。我想获取第一次连接时存储在数组中的usernameAvailable
    • 使用 'usernameAvailable.from' 获取传入消息的套接字 id。
    猜你喜欢
    • 1970-01-01
    • 2015-12-09
    • 2012-08-14
    • 1970-01-01
    • 2012-03-18
    • 2012-03-20
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多