私はSocket.ioとExpressが初めてです。私は、ユーザーをセッションに割り当てながら、基本的なチャット シナリオを実行する作業を行っています。私の調査から、これを行う方法は星の数ほどあることに気付きました。また、「受け入れられた標準」が実際には1つもないことにも気付きました(間違っている場合は、見せてください)。これは私が見つけた最も簡単な方法でした ( 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」のリスナーでは、「Uncaught ReferenceError: req is not defined」という「req.session.user」のエラーが返されます。
どうすればこれを克服できますか?