Created
November 30, 2013 10:37
-
-
Save seka/7717513 to your computer and use it in GitHub Desktop.
Node.jsのメモリーストアをmongoDBに設定した後に、Socket.io側からアクセスしたくて
色々調べてもよく分からなかったので、自分で実装してみた.(mongooseを使ったのは甘え)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
exports.SocketServerClass = class SocketServerClass | |
_sioListenPort = 8080 | |
constructor : (@app, @node_modules, @appOption) -> | |
@sio = @node_modules.sio | |
@http = @node_modules.http | |
@appServer = @http.createServer(@app) | |
setup : () -> | |
# socketioの起動 | |
@appServer.listen(_sioListenPort) | |
exports.socketServer = @sio.listen(@appServer) | |
@serverConfig() | |
return console.log("socket_server setup.") | |
serverConfig : () -> | |
exports.socketServer.configure () -> | |
@.set 'transports', ['websocket', 'flashsocket', 'htmlfile', 'xhr-polling', 'jsonp-polling'] | |
@.set 'log level', 2 | |
# socket.ioからmongoDBに保存されているCookieデータにアクセスする | |
@.set 'authorization', (handshakeData, callBack) -> | |
if (!handshakeData.headers.cookie) | |
return callBack('not found Cookie', false) | |
# handshakeDataからcookieデータを抽出 | |
cookieData = handshakeData.headers.cookie | |
cookies = cookieData.replace(/\s+/g, '').split(';') | |
for c in cookies | |
parse = c.split('=') | |
cookies[parse[0]] = parse[1] | |
# connect.sidが署名された状態なので、それを取り外している。 | |
parse = cookies['connect.sid'].replace(/s%3A/, '') | |
index = parse.indexOf('.') | |
sessionID = parse.substr(0, index) | |
# sidを元にmongoDBからユーザ名を取得する | |
mongoClass = exports.MongoClass.serachMongo(handshakeData, decodeURIComponent(sessionID), callBack) | |
exports.MongoClass = new (class MongoClass | |
constructor : () -> | |
# mongooseの設定 | |
# 接続はサービスをセットアップするときのみ行う(接続が重複するとエラーになる | |
socketOption = require './config/option.json' | |
@db = socketOption.session.database | |
@collection = socketOption.session.collection | |
@mongoose = require 'mongoose' | |
@Schema = @mongoose.Schema | |
@sessionScheme = new @Schema({ | |
_id : String | |
data : Object | |
expires : Date | |
sid : String | |
}) | |
@mongoose.connect "mongodb://localhost/#{@db}" | |
@sessionsCollection = @mongoose.model(@collection, @sessionScheme) | |
serachMongo : (handshakeData, sessionID, callBack) -> | |
@sessionsCollection.findOne {sid : sessionID}, (err, data) => | |
if (data?) | |
console.log data.data.username | |
handshakeData.sessionID = data.data.username | |
callBack(null, true) | |
else | |
callBack(null, false) | |
) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment