SORU
23 NİSAN 2011, CUMARTESİ


ve oturum oluşturmak okumayı express node.JS

Bir sohbet soket ile uygulama yapıyorum.ıo express.

Bu yapmak istediğim şey bu. Kullanıcılar istemci nodejs için kullanıcı e-posta göndereceğiz sohbet uygulaması, sunucu girin, kullanıcı e-posta değeri ile bir oturum oluşturmak istiyorum.

Kullanıcılar bir nodejs için mesaj sunucusu sohbet gönderirken, veri istemciden gönderilen oluşturulan oturum ile aynı e-posta varsa, o mesajı yayınlanacak, başka değil.

Aşağıda benim kodu, ... ... çalışması için gereken plana göre gidiyorum. Benim kod konusunda şüpheliyim, eğer bir oturum oluşturuldu ve bu oturumu kontrol etmek için nasıl bilmiyorum.

var io   = require('socket.io'),
    express = require('express');
    querystring = require('querystring');

var app = express.createServer();
app.get('/', function(req, res){
    var sessionVal = querystring.parse(req.url.substr(2));// sessionVal is an email for example: me@gmail.com
    app.use(express.cookieParser());
    app.use(express.session({ secret: sessionVal }));
});
var socket = io.listen(app);
socket.on('connection', function(client) {
    client.on('message', function(message) {
        // message will be an object {text:'user text chat blah blah', email:'me@gmail.com'}
        // if the seesion stored, has the same value with message.email
        // then the message will be broadcasted
            socket.broadcast(message.text);
        // else will not broadcast  
    });
});

app.listen(4000);

CEVAP
23 NİSAN 2011, CUMARTESİ


Yanlış uygulama katman ekleme olduğunu burada belirtmem gerekiyor. app.use aramalar app.get isteği işleyicisi, ama bunun dışında yapılmamalıdır. Sadece onları doğrudan createServer, sonra Ara veya the other examples in the docs bir göz atın.

8* *geçirmek gizli bir dize sabit olmalı, ya da belki bir yapılandırma dosyasından alınır. Bir şey anlatma istemci biliyor olabilir, bu gerçekten tehlikeli. Bir gizli server hakkında bilmeniz gereken tek şey.

Eğer oturumda e-posta adresini saklamak istiyorsanız, sadece bir hat boyunca bir şey yapın:

req.session.email = req.param('email');

Bu şekilde dışarı ile...


Eğer doğru anladıysam, yapmaya çalıştığın şey, bir veya daha fazla HTTP isteği işlemek ve bir oturumu izlemek, Aç daha sonra bir Yuva.IO hangi oturum verileri de ihtiyacınız olan bağlantı.

Bu sorun hakkında yanıltıcı öyle Yuva.Büyü çalışmak http.Server herhangi yapma IO demektir request olay kaçırarak. Böylece, Express' (ya da daha doğrusu Connect'In) oturum katman asla Yuva denir.IO bağlantısı.

Bu iş olsa da, bazı hile ile yapabilirsiniz inanıyorum.

Connect oturum verileri alabilirsiniz; sadece oturumu saklamak için bir referans almak gerekir. Bunu yapmak için en kolay yolu kendinize saklamak express.session çağırmadan önce oluşturmak için:

// A MemoryStore is the default, but you probably want something
// more robust for production use.
var store = new express.session.MemoryStore;
app.use(express.session({ secret: 'whatever', store: store }));

Her oturum deposu get(sid, callback) bir yöntemi vardır. sid parametre veya oturum KİMLİĞİ, istemci üzerinde bir çerez saklanır. Bu tanımlama bilgisi varsayılan adı connect.sid. (Ama express.session çağrı key bir seçenek belirterek. herhangi bir isim verebilirsiniz)

Daha sonra yuvada kurabiye girmeniz gerekiyor.IO bağlantısı. Ne Yazık Ki, Yuva.IO http.ServerRequest erişim vermek için görünmüyor. Basit bir çözüm tarayıcıda çerez getir ve Yuva gönder.IO bağlantısı.

Sunucu üzerinde kod aşağıdaki gibi görünecektir:

var io      = require('socket.io'),
    express = require('express');

var app    = express.createServer(),
    socket = io.listen(app),
    store  = new express.session.MemoryStore;
app.use(express.cookieParser());
app.use(express.session({ secret: 'something', store: store }));

app.get('/', function(req, res) {
  var old = req.session.email;
  req.session.email = req.param('email');

  res.header('Content-Type', 'text/plain');
  res.send("Email was '"   old   "', now is '"   req.session.email   "'.");
});

socket.on('connection', function(client) {
  // We declare that the first message contains the SID.
  // This is where we handle the first message.
  client.once('message', function(sid) {
    store.get(sid, function(err, session) {
      if (err || !session) {
        // Do some error handling, bail.
        return;
      }

      // Any messages following are your chat messages.
      client.on('message', function(message) {
        if (message.email === session.email) {
          socket.broadcast(message.text);
        }
      });
    });
  });
});

app.listen(4000);

Bu, yalnızca varolan bir oturumu okumak istiyorum varsayar. Aslında oturumları, çünkü Yuva oluşturmak silemezsiniz.IO bağlantı Set-Cookie Başlığı (WebSockets sanırım) göndermek için HTTP yanıt olmayabilir.

Eğer oturumları düzenlemek istiyorsanız, bazı oturum mağazaları ile çalışabilir. Bir CookieStore da olmaz ki Set-Cookie bir başlık göndermek gerekiyor çünkü örneğin iş olmaz. Ama diğer mağazaları için, set(sid, data, callback) yöntemini çağırmak deneyin ve neler olacağını görün.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • iZAPPA

    iZAPPA

    16 Temmuz 2010
  • Jonnyriddlin1

    Jonnyriddlin

    4 Ocak 2007
  • UCBerkeley

    UCBerkeley

    3 Mayıs 2006