node.js - socket.io 发出和广播事件,但不会从服务器中引发"hear" 事件

  显示原文与译文双语对照的内容
139 2

我是 socket.io的新手。 我正在努力获取基本聊天方案,同时将用户分配给会话。 从我的研究中我已经意识到有多种方法可以做到这一点。 我还意识到,如果我真的没有一个"接受标准"( 如果我错了,请。 这是我发现( 。使用 req 。'名称'='值的最简单的方法

以下是我的服务器代码:


var express = require('express')
, routes = require('./routes')
, user = require('./routes/user')
, path = require('path')
, http = require('http')
, io = require('socket.io')
, cookie = require("cookie")
, connect = require("connect")
, app = express();


//all environments
app.configure(function() {
 app.set('port', process.env.PORT || 3000);
 app.set('views', __dirname + '/views');
 app.set('view engine', 'jade');
 app.use(express.static(path.join(__dirname, 'public')));
 app.use(express.favicon());
 app.use(express.logger('dev'));
 app.use(express.bodyParser());

 app.use(express.cookieParser());
 app.use(express.session({secret: 'secret'}));
 app.use(app.router);
});

var server = http.createServer(app);
server.listen(app.get('port'), function() {
 console.log('ready');
});

var io = io.listen(server);


app.get('/', routes.index);
app.get('/user', routes.user); 

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

 socket.emit('connected', { connect: 'CONNECTED TO THE SERVER' });

 socket.on('client connect', function (data) {
 console.log("HEARD THE CLIENT");
 });

 socket.on('addingNewUser', function (data) {
 console.log('BROADCASTING ADDUSER');
 console.log(data);
 socket.broadcast.emit('addUser', data);
 });
});

以下是我的index.jade 代码:


extends layout

block content
 script(src="/socket.io/socket.io.js")
 script(src="/javascripts/index.js")
 script.
 var socket = io.connect('http://localhost:3000');

 socket.on('connected', function (data) {
 socket.emit('client connect', { connect: 'CLIENT IS CONNECTED' });
 });

 socket.on('addUser', function (data) {
 console.log("ADDING NEW USER:");
 req.session.user = data;
 console.log(data);
 $("#usernames").append('<p>'+data+'</p>');
 });

 $(document).ready(function(){
 $('#submit').click( function (data) {
 console.log("SUBMITTING FORM!");
 var userName = $("#add_user").val();
 console.log("user name" + userName);
 socket.emit('addingNewUser', { user: userName });
 return false;
 });
 }); 


 #users.large-3.columns
 h5 Online Users
 p#usernames

 #messages.large-6.columns
 form
 fieldset
 legend I am (the) Legend
 input(type='text', id='add_user', name='add_user', placeholder='Type your name.')
 input.button.small(type='submit', id="submit", value='Send')
 #show_messages
 ul#user_message
. large-3.columns

某些缩进可能由于StackOverflow格式而关闭,但在实际文件中它的效果很好。

你可以很好地跟踪所有控制台日志。 它在"广播用户"后在 console.log 处停止。

由于某些原因,'adduser'的侦听器没有得到任何。

有什么想法吗?


编辑:就像评论中指出的,广播只向它没有产生的套接字发出。 这就是为什么它从不触发监听器。

但是,现在我有了一个新的问题。 一个我之前遇到过的。

在'adduser'的侦听器中,它为'req.session.user'返回一个错误,表示'ReferenceError: req未定义为"。

我该如何克服?

时间: 原作者:

114 0

你正在混合你的客户端和服务器逻辑。

这里代码( 从你的模板):


socket.on('addUser', function (data) {
 console.log("ADDING NEW USER:");
 req.session.user = data;
 console.log(data);
 $("#usernames").append('<p>'+data+'</p>');
});

在客户端不需要可用对象的情况下执行。

默认情况下,socket.io 和express会话不一起播放- 你需要为你的应用程序添加一些额外的逻辑。

有几个项目旨在使这更容易,如:

原作者:
...