我是 Socket.io 和 Express 的新手。在将用户分配到会话时,我正在努力启动和运行基本的聊天场景。从我的研究中,我意识到有很多方法可以做到这一点,就像有星星一样。我也意识到确实没有一个“公认的标准”(如果我错了,请告诉我)。这是我想出的最简单的方式(使用 req.session.'name' = 'value')
这是我的服务器代码:
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 格式,一些缩进可能会关闭,但在实际文件中它很好。
您可以很好地跟踪所有控制台日志。它在“BROADCASTING USER”之后停在 console.log 处。
出于某种原因,“addUser”的侦听器没有收到任何东西。
有任何想法吗?
编辑:正如评论中所指出的,广播只发射到它不是来自的套接字。所以这就是为什么它从来没有触发听众。
但是,现在我遇到了一个新问题。我以前遇到过的一个。
在“addUser”的侦听器中,它为“req.session.user”返回一个错误,指出“未捕获的 ReferenceError:req 未定义”。
我该如何克服呢?