2016-10-24 13 views
-1

チャットルームを構築しようとしています。ここでは、パスポートとエクスプレスの間のユーザーセッションをsocket.ioに渡します。今はメッセージを出すことができません。 io.onは接続していないようです。socket.ioでメッセージを送信できません

は、私がここで

var express = require('express'); 
 
var app = express(); 
 
var server = require('http').Server(app); 
 

 
var port = process.env.PORT || 8080; 
 
var mongoose = require('mongoose'); 
 
var passport = require('passport'); 
 
var flash = require('connect-flash'); 
 

 
var morgan = require('morgan'); 
 
var cookieParser = require('cookie-parser'); 
 
var bodyParser = require('body-parser'); 
 
var session = require('express-session'); 
 

 
// Add connect-mongo to project - npm install connect-mongo 
 
var MongoStore = require('connect-mongo')(session); 
 

 
var configDB = require('./config/database.js'); 
 
var http = require('http').Server(app); 
 
var io = require('socket.io')(http); 
 
var chatdb = require('./app/models/chat.js'); 
 

 
// configuration =============================================================== 
 
// NOTE: This might need to be put into a callback/promise inside an initialize function 
 
var db = mongoose.connect(configDB.url); // connect to our database 
 

 
require('./config/passport')(passport); // pass passport for configuration 
 

 
// set up our express application 
 
app.use(morgan('dev')); // log every request to the console 
 
app.use(cookieParser()); // read cookies (needed for auth) 
 
app.use(bodyParser()); // get information from html forms 
 

 
app.set('view engine', 'ejs'); // set up ejs for templating 
 

 

 
// required for passport 
 
app.use(session({ secret: 'secret' })); // session secret 
 
app.use(passport.initialize()); 
 
app.use(passport.session()); // persistent login sessions 
 
app.use(flash()); // use connect-flash for flash messages stored in session 
 
app.use(express.static(__dirname + '/views')); 
 
app.use(express.static(__dirname + '/public')); 
 

 
// Create a MongoDB storage object 
 
var mongoStore = new MongoStore({ 
 
    mongooseConnection: db.connection, 
 
    collection: configDB.sessionCollection, 
 
}); 
 

 
// Intercept Socket.io's handshake request 
 
io.use(function (socket, next) { 
 
    // Use the 'cookie-parser' module to parse the request cookies 
 
    cookieParser('secret')(socket.request, {}, function (err) { 
 
     // Get the session id from the request cookies 
 
     var sessionId = socket.request.signedCookies ? socket.request.signedCookies['session-key'] : undefined; 
 

 
     if (!sessionId) return next(new Error('sessionId was not found in socket.request'), false); 
 

 
     // Use the mongoStorage instance to get the Express session information 
 
    mongoStore.get(sessionId, function (err, session) { 
 
     if (err) return next(err, false); 
 
     if (!session) return next(new Error('session was not found for ' + sessionId), false); 
 

 
     // Set the Socket.io session information 
 
     socket.request.session = session; 
 
     console.log(session); 
 
     console.log(socket.request.user); 
 

 
     // Use Passport to populate the user details 
 
     passport.initialize()(socket.request, {}, function() { 
 
     passport.session()(socket.request, {}, function() { 
 
     // This will prohibit non-authenticated users from connecting to your 
 
     // SocketIO server. 
 
    if (socket.request.user) { 
 
    next(null, true); 
 
    } else { 
 
    next(new Error('User is not authenticated'), false); 
 
    } 
 
    }); 
 
    }); 
 
    }); 
 
    }); 
 
}); 
 

 
// socket.io 
 
io.on('connection', function (socket) { 
 
    console.log('a user connected'); 
 

 
    socket.on('chat message', function(msg){ 
 
    console.log('a use connected'); 
 
    var name = "efe"; 
 
    chatdb.saveMsg({name: name, msg: msg}, function(err){ 
 
     if(err) throw err; 
 
     io.emit('chat message', msg); 
 
     }); 
 
    }); 
 

 
    socket.on('disconnect', function() { 
 
    console.log('user disconnected'); 
 
}); 
 
}); 
 

 
// routes ====================================================================== 
 
require('./app/routes.js')(app, passport); // load our routes and pass in our app and fully configured passport 
 

 
// launch ====================================================================== 
 
http.listen(port); 
 
console.log('The magic happens on port ' + port);

私のコード

あるすべてのエラーメッセージ

を得ることはありません。これは、私のクライアント側のコードです。

<!doctype html> 
 
<html> 
 
    <head> 
 
    <title>chat message</title> 
 

 
    <link rel="stylesheet" href="/css/chat.css" type="text/css"/> 
 
    </head> 
 
    <body> 
 
    <div class="messages"><br/><br/><br/><br/><br/><br/> </div> 
 
    <form action=""> 
 
     <input id="m" autocomplete="off" /><button>Send</button> 
 
    </form> 
 
    <script src="https://cdn.socket.io/socket.io-1.3.7.js"></script> 
 
    <script src="http://code.jquery.com/jquery-1.11.1.js"></script> 
 
    <script> 
 
     var socket = io(); 
 
     $('form').submit(function(){ 
 
     socket.emit('chat message', $('#m').val()); 
 
     $('#m').val(''); 
 
     return false; 
 
     }); 
 
     socket.on('chat message', function(msg){ 
 
     $('.messages').append($('<div class=bubble><br/>').text(msg)); 
 
     }); 
 
    </script> 
 
    </body> 
 
</html>

+0

私の修正だった;'非同期コールバックの内側にはかなりありますエラーが役に立たないため、無駄なエラー処理が必要です。 – jfriend00

+0

すべての 'io.use()'をコメントアウトして、もっと簡単なsocket.ioチャットレスポンダを持っていれば動作しますか?そして、あなたは何を観察していますか?エクスプレスルートは機能しますか?サーバーは稼動していますか?クライアントはsocket.ioに正常に接続できますか?関連するクライアントsocket.ioコードはどこですか? – jfriend00

+0

エラー処理のヒント、javascript初心者ありがとうございます。私がio.use()をコメントアウトすると動作します。すべての高速道路が機能しています。サーバーが動作しており、関連するクライアント側のコードを追加しました。 –

答えて

0

これはちょうど、あなたが知っているので、 `場合(ERR)スローERR

var express = require('express'); 
 
var app = express(); 
 
var server = require('http').Server(app); 
 

 
var port = process.env.PORT || 8080; 
 
var mongoose = require('mongoose'); 
 
var passport = require('passport'); 
 
var flash = require('connect-flash'); 
 

 
var morgan = require('morgan'); 
 
var cookieParser = require('cookie-parser'); 
 
var bodyParser = require('body-parser'); 
 
var session = require('express-session'); 
 

 
// Add connect-mongo to project - npm install connect-mongo 
 
var MongoStore = require('connect-mongo')(session); 
 

 
var configDB = require('./config/database.js'); 
 
var http = require('http').Server(app); 
 
var io = require('socket.io')(http); 
 
var chatdb = require('./app/models/chat.js'); 
 

 
// configuration =============================================================== 
 
// NOTE: This might need to be put into a callback/promise inside an initialize function 
 
var db = mongoose.connect(configDB.url); // connect to our database 
 

 
require('./config/passport')(passport); // pass passport for configuration 
 

 
// set up our express application 
 
app.use(morgan('dev')); // log every request to the console 
 
app.use(cookieParser()); // read cookies (needed for auth) 
 
app.use(bodyParser()); // get information from html forms 
 

 
app.set('view engine', 'ejs'); // set up ejs for templating 
 
var mongoStore = new MongoStore({ 
 
    mongooseConnection: db.connection, 
 
}); 
 
app.use(session({ 
 
    secret: 'secret', 
 
    clear_interval: 900, 
 
    cookie: { maxAge: 2 * 60 * 60 * 1000 }, 
 
    store: mongoStore, 
 
})); 
 

 

 

 
// required for passport 
 
app.use(session({ secret: 'secret' })); // session secret 
 
app.use(passport.initialize()); 
 
app.use(passport.session()); // persistent login sessions 
 
app.use(flash()); // use connect-flash for flash messages stored in session 
 
app.use(express.static(__dirname + '/views')); 
 
app.use(express.static(__dirname + '/public')); 
 

 

 

 

 
// Intercept Socket.io's handshake request 
 
io.use(function(socket, next) { 
 

 
    // Use the 'cookie-parser' module to parse the request cookies 
 
    cookieParser('secret')(socket.request, {}, function(err) { 
 

 
     // Get the session id from the request cookies 
 
     var sessionId = socket.request.signedCookies ? socket.request.signedCookies['connect.sid'] : undefined; 
 

 
     if (!sessionId) return next(new Error('sessionId was not found in socket.request'), false); 
 

 
     // Use the mongoStorage instance to get the Express session information 
 
     mongoStore.get(sessionId, function(err, session) { 
 
      console.log('efe'); 
 
      if (err) return next(err, false); 
 
      if (!session) return next(new Error('session was not found for ' + sessionId), false); 
 

 
      // Set the Socket.io session information 
 
      socket.request.session = session; 
 
      console.log(sessionId); 
 
      console.log(socket.request.user); 
 

 
      // Use Passport to populate the user details 
 
      passport.initialize()(socket.request, {}, function() { 
 
       passport.session()(socket.request, {}, function() { 
 
        // This will prohibit non-authenticated users from connecting to your 
 
        // SocketIO server. 
 
        if (socket.request.user) { 
 
         next(null, true); 
 
        } else { 
 
         next(new Error('User is not authenticated'), false); 
 
        } 
 
       }); 
 
      }); 
 
     }); 
 
    }); 
 
    }); 
 

 
// socket.io 
 
io.on('connection', function(socket) { 
 
    console.log('a user connected'); 
 

 
    socket.on('chat message', function(msg) { 
 
     console.log('a use connected'); 
 
     var name = "efe"; 
 
     chatdb.saveMsg({ 
 
      name: name, 
 
      msg: msg 
 
     }, function(err) { 
 
      if (err) throw err; 
 
      io.emit('chat message', msg); 
 
     }); 
 
    }); 
 

 
    socket.on('disconnect', function() { 
 
     console.log('user disconnected'); 
 
    }); 
 
}); 
 

 
// routes ====================================================================== 
 
require('./app/routes.js')(app, passport); // load our routes and pass in our app and fully configured passport 
 

 
// launch ====================================================================== 
 
http.listen(port); 
 
console.log('The magic happens on port ' + port);

関連する問題