简体   繁体   English

如何使用socket.io正确发出事件?

[英]How to properly emit an event using socket.io?

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var fs = require('fs');
var expressCookieParser = require('cookie-parser');
var expressSession = require('express-session');

var COOKIE_SECRET = 'very secret string';
var EXPRESS_SID_KEY = 'connect.sid';
var cookieParser = expressCookieParser(COOKIE_SECRET);
var sessionStore = new expressSession.MemoryStore();

app.use(expressSession({
    store: sessionStore,
    resave: false,              
    saveUninitialized: false,   
    secret: COOKIE_SECRET,      
    name: EXPRESS_SID_KEY       
}));

var messageHistory = '';
var userNick ='';



app.use(cookieParser);

app.get('/', function(req, res){
    res.sendFile(__dirname + '\\HTML\\loginWindow.html');
    req.session.isLogged = true;
    req.session.username = 'Hello.World';
});

app.get('/chat', function(req, res){    
    res.sendFile(__dirname + '\\HTML\\index.html');
});

app.get('/logout', function (req, res) {
    req.session.isLogged = false;
    delete req.session.username;
    req.session.destroy();

    res.sendFile(__dirname + '\\HTML\\loginWindow.html');
});

io.use(function(socket, next) {
    var request = socket.request;

    if(!request.headers.cookie) {
        console.log('No cookie transmitted.');
    }

    cookieParser(request, {}, function(parseErr) {
        if(parseErr) { return next(new Error('Error parsing cookies.')); }

        var sidCookie = (request.secureCookies && request.secureCookies[EXPRESS_SID_KEY]) ||
                        (request.signedCookies && request.signedCookies[EXPRESS_SID_KEY]) ||
                        (request.cookies && request.cookies[EXPRESS_SID_KEY]);

        sessionStore.load(sidCookie, function(err, session) {
            if (err) {
                return next(err);

            } else if(!session) {
                console.log('Session cannot be found/loaded');
                //io.emit('event') doesn't work here, how to do it?
            } else if (session.isLogged !== true) {
                console.log('User not logged in');

            } else {
                request.session = session;
                request.sessionId = sidCookie;

                return next();
            }
        });
    });
});

io.on('connection', function(socket){
    socket.on('login', function(nick){
        userNick = nick;
        console.log(userNick + " was logged!");
        io.emit('logged');

    });
      socket.on('chat message', function(msg){
          var message = userNick +': '+ msg;
          io.emit('chat message',message);
          messageHistory += message + " \n";
          fs.writeFile(__dirname +'/history.txt', messageHistory, function(err) {
              if(err) {
                  return console.log(err);
              }
          }); 
      });
});

http.listen(3000, function(){
console.log('listening on *:3000');
});

I try to write a simple chat application using node.js. 我尝试使用node.js编写一个简单的聊天应用程序。 My problem lies inside the method io.use. 我的问题在于io.use方法内。 I wanted to secure my chat, so nobody can enter it using just domain/chat link, but i really don't know how. 我想保护我的聊天,所以没有人可以仅使用域/聊天链接输入它,但是我真的不知道如何。 I know it must be done somehow inside io.use method and i tried simply emmiting an event using io.emit('back_to_main), but it doesn't seem to work. 我知道它必须在io.use方法内以某种方式完成,并且我尝试使用io.emit('back_to_main)来简单地发出一个事件,但是它似乎不起作用。 I know this code is garbage, it's my first contact with JS, but maybe somebody can just help me with this simple question. 我知道这段代码是垃圾,这是我第一次接触JS,但是也许有人可以帮我解决这个简单的问题。

There are two methods you can do this 有两种方法可以执行此操作
1. either use following module link . 1.使用以下模块链接
2. use can use expresssession in io.use and pass the request variable to it like this 2. use可以在io.use中使用expresssession并将请求变量传递给它

 var req = socket.request;
        app.use(expressSession(req,{},function(req,res){
            next();
        }));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM