2016-03-22 9 views
2

Derzeit implementiere ich Echtzeit-Benachrichtigungen für mein Django-Projekt.Echtzeit-Benachrichtigungen mit Django und Socket.io

Ich befolge die Anweisungen von this tutorial. Problem ist, ich benutze Socket.io 1.4.5 und Tutorial ist für Pre-1.0-Versionen geschrieben. Also musste ich einige Code nach 'Migrating from 0.9' Richtlinie auf Socket.io Website anpassen. Was ich habe ist:

var http = require('http'); 
var server = http.createServer().listen(8002); 
var io = require('socket.io')(server); 
var cookie_reader = require('cookie'); 
var querystring = require('querystring'); 
var redis = require('redis'); 

// Supposedly this should store cookie set by Django 
io.use(function(socket,accept){ 
    var data = socket.request; 
    if(data.headers.cookie){ 
    data.cookie = cookie_reader.parse(data.headers.cookie); 
    return accept(null, true); 
    } 
    return accept('error', false); 
}); 

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

    // Redis client 
    client = redis.createClient(); 

    // Subscribe to notification channel 
    client.subscribe('notifications.' + socket.handshake.cookie['sessionid']); 
    console.log('subscribed'); 

    //Grab message from Redis and send to client 
    client.on('message', function(channel, message){ 
     console.log('on message', message); 
     socket.send(message); 
    }); 

    // Unsubscribe 
    socket.on('disconnect', function() { 
     client.unsubscribe('notifications.' + socket.handshake.cookie['sessionid']); 
    }); 
}); 

Wenn ich renne dieses Skript:

node notifications.js 

Nach 2 Sekunden Stille ich diese Fehlermeldung erhalten:

client.subscribe('notifications.' + socket.handshake.cookie['sessionid']); 
                 ^
TypeError: Cannot read property 'sessionid' of undefined 
at Namespace.<anonymous> (path/to/notifications.js) 
at Namespace.emit (events.js:107:17) 
at Namespace.emit (/path/to/node_modules/socket.io/lib/namespace.js:206:10) 
at /path/to/node_modules/socket.io/lib/namespace.js:174:14 
at process._tickCallback (node.js:355:11) 

Kann jemand mir zeigen, was ich habe falsch gemacht?

Antwort

2

Gerade gefunden, was mein Fehler war.

Um auf Cookie zuzugreifen, anstelle von socket.handshake sollte ich socket.request verwenden. So sieht mein aktueller Code jetzt so aus:

var http = require('http'); 
var server = http.createServer().listen(8002); 
var io = require('socket.io')(server); 
var cookie_reader = require('cookie'); 
var querystring = require('querystring'); 
var redis = require('redis'); 

io.use(function(socket,accept){ 
    var data = socket.request; 
    if(data.headers.cookie){ 
     data.cookie = cookie_reader.parse(data.headers.cookie); 
     return accept(null, true); 
    } 
    return accept('error', false); 
}); 

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

    // Redis client 
    client = redis.createClient(); 

    // Subscribe to notification channel 
    client.subscribe('notifications.' + socket.request.cookie['sessionid']); 
    console.log('subscribed'); 

    //Grab message from Redis and send to client 
    client.on('message', function(channel, message){ 
     console.log('on message', message); 
     socket.send(message); 
    }); 

    // Unsubscribe 
    socket.on('disconnect', function() { 
     client.unsubscribe('notifications.' + socket.request.cookie['sessionid']); 
    }); 
}); 
+0

Haben Sie einen Drittanbieter-Dienst in Betracht gezogen? – Ryan

+0

Ryan, noch nicht. Ich bin neu bei Webdev und habe mich einfach an die erste Lösung gehalten, die ich gesehen habe. Derzeit ist meine App nur auf der Website verfügbar. Gibt es einen Punkt bei der Nutzung von Drittanbieterdiensten? – Greesha0

+0

Im Gegenteil, ich finde, dass die Verwendung eines Drittanbieter-Dienstes einen Großteil des Aufwands für die Entwicklung und Wartung Ihrer Architektur auslagert. Zum Beispiel: Werfen Sie einen Blick auf PubNub, es gibt eine einfache API, um alle Ihre Echtzeit-Messaging zu behandeln. Könnte die Rechnung nicht genau passen, aber es gibt viele da draußen. Sockets sind definitely erweiterte Sachen, mit denen zu arbeiten, vor allem mit Django beginnen - ein Framework, das sehr um synchrone http gebaut ist – Ryan