简体   繁体   中英

express.js passing variables after loading view

I'm writing a chat application. Firstly I had loaded my views via Ajax, but then I realized it isn't necessary, because I can use exports in express insted. I think it is a better solution but I don't know now how can I pass a variable from my login form to script.js. Passing username ( username = req.body.user; ) in rooms.js to server.js works, because I've got a proper name in console, which I typed in text input, but when I'm emitting 'test' to script.js nothing happens, I've nothing in my browser console. I suposse that the message in console appears for a moment and then the new view is loaded so it disappears. I tried to change the order of code but didn't help. Any sugestions? Am I doing something wrong ? I'm just beginning to learn node and express so I will be grateful for any help.

server.js

 var express = require('express')
                , routes = require('./routes')
                , music = require('./routes/music')
                , art = require('./routes/art')
                , rooms = require('./routes/rooms')
                , http = require('http')
                , app = express()
                , server = http.createServer(app)
                , io = require('socket.io').listen(server)
                , path = require('path')
                , jade = require('jade')
                , mysql = require('mysql');

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

        app.get('/', routes.index);
        app.get('/music', music.rooms);
        app.get('/art', art.rooms);
        app.post('/rooms', rooms.rooms);

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

            socket.on('joinRoom', function(data) {
                socket.username = username;
                socket.room = data.room; 
 console.log('socket room and username in console' + socket.room+socket.username);
                socket.join(socket.room);
                socket.emit('test');
        });

        server.listen(3000);

script.js

var socket = io.connect();

$(document).ready(function() {  

  $('#rooms').on('click', 'a', function() {
         var room = $(this).data('id');       
      socket.emit('joinRoom', {room: room});
 });   
        socket.on('test', function(){
            console.log('check if it works');
        });
    });

index.jade

include header.jade

    div#page    
        div(class="box")
                form(name="input", action='rooms', method="post")
                   div
                    p
                        | Login:
                        input(type="text", name="user", class="user")
                    input(type="submit",class="submit",value="Login")

rooms.jade

include header.jade

    div#page  
        div(class="box")    

             div#rooms
                h2 Rooms
                a(data-name='abrakadabra', data-id='1', href='music') Abrakadabra
                a(data-name='aloha', data-id='2', href='art') Aloha

rooms.js in routes folder

exports.rooms = function(req, res){
res.render('rooms', { title: 'Rooms' });
    username = req.body.user;

};

music.js (one of the room)

exports.rooms = function(req, res){
  res.render('music', { title: 'Music room' });

};

Add event.preventDefault() to your room click function. Those links are refreshing the page, they shouldn't.

var socket = io.connect();

$(document).ready(function() {  

  $('#rooms').on('click', 'a', function() {
    event.preventDefault();
    var room = $(this).data('id');       
    socket.emit('joinRoom', {room: room});
  });

  socket.on('test', function(){
    console.log('check if it works');
  });

});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM