在Nodejs中没有关于任何其他用户的最新帖子信息

时间:2013-12-08 06:08:24

标签: mysql node.js session login socket.io

我请求你的支持...... 我有以下结构超级摘要:

variable1 = "username bd successfully extracted in Mysql, here there is no problem, and I checked"

io.sockets.on ('connection', function (socket) {
socket.emit ('initialize', {username: variable1}
}

正如您将了解我有几个用户连接,例如我有5个连接一个接一个,如果所有(CONNECTED)更新浏览器,所有都自动继承最后一个显然不想要的用户的名称,每个人都应该有自己的名字。我尝试通过实现会话来修复它,但不允许我在io.sockets.on('connection',function(socket))中使用它们。

我希望以前有人能解决这个问题,再次感谢你们的宝贵帮助。


没有。我把连接搞定了。为了更好地了解我,我会发布我的代码,也许你可以帮助我(如果我引起任何不适,请原谅我)。我的语言是西班牙语,但使用谷歌翻译来帮助我解释我的问题,希望不要混淆。在西班牙语,没有太多的信息,我建议使用passport.js,但我是初学者,不知道如何实现它,删除什么,应该删除工作...请求帮助请。非常感谢你!

我的代码是:

var port = process.env.PORT || 3000;
/**
 * Module dependencies.
 */

var express = require('express')
  , routes = require('./routes')
  , user = require('./routes/user')
  , http = require('http')
  , path = require('path')
  , mysql = require('mysql');

var crypto = require('crypto');

var app = express();
server = http.createServer(app);
var io = require('socket.io').listen(server);
server.listen(port);


/*http.createServer(app).listen(3000, function(){
  console.log("Express server listening on port " + 3000);
});*/

app.configure(function(){
  /*app.set('port', process.env.PORT || 3000);*/
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser('your secret here'));
  app.use(express.session({secret: 'esto es secreto'}));
  app.use(app.router);
  app.use(express.static(path.join(__dirname, 'public')));
});

app.configure('development', function(){
  app.use(express.errorHandler());
});



var db_config = {
    host: 'localhost',
    user: 'user',
    password: 'password',
    database: 'db_name'
};

var coneccion;

function handleDisconnect() {
  coneccion = mysql.createConnection(db_config);    // Recreate the connection, since
                                                                    // the old one cannot be reused.

  coneccion.connect(function(err) {                 // The server is either down
    if(err) {                                                   // or restarting (takes a while sometimes).
      console.log('error when connecting to db:', err);
      setTimeout(handleDisconnect, 2000);               // We introduce a delay before attempting to reconnect,
    }                                                               // to avoid a hot loop, and to allow our node script to
  });                                               // process asynchronous requests in the meantime.
                                                                    // If you're also serving http, display a 503 error.
    coneccion.on('error', function(err) {
    console.log('db error', err);
        if(err.code === 'PROTOCOL_CONNECTION_LOST') {   // Connection to the MySQL server is usually
            handleDisconnect();                                 // lost due to either server restart, or a
        } else {                                                        // connnection idle timeout (the wait_timeout
            throw err;                                              // server variable configures this)
        }
    });
}

handleDisconnect();


function login(req, res, next){
  if(req.session.user){
    next();
  }else{
    res.redirect('/login');
  }
}

function encriptar(cadena){
  var myString = cadena;
  return crypto.createHash('md5').update(myString).digest("hex");
}

app.get('/', routes.index);
app.get('/users', user.list);

// pagina que renderiza el formulario del login.
app.get('/login', function(req, res){
  res.render('login', {title: 'Ingreso'});
});

app.get('/principal', login, function(req, res){
  res.sendfile(__dirname + '/public/pantalla_principal.html');
});

app.get('/profesor', login, function(req, res){
  res.sendfile(__dirname + '/public/pantalla_profesor.html');
});

app.post('/autenticar', function(req, res){
  //var connection = BD();
  var user = req.body.txtUsuario;
  var clave = encriptar(req.body.txtClave);
  coneccion.query('SELECT * FROM sm_usuario WHERE nombre="'+ user +'" and contrasena="'+ clave +'"' , function(error, resultado, fila){
    if(!error){
      if(resultado.length>0){
        console.log("EL ID DEL USUARIO ES: "+ resultado[0].id_usuario);
        coneccion.query('SELECT * FROM sm_alumno WHERE id_usuario="'+ resultado[0].id_usuario +'"', function(error, resultado2, fila2){
          if(!error){
              req.session.user        = user;
              nivel_acceso            = resultado[0].nivel_acceso;
              avatar                  = resultado[0].id_avatar;
              id_usuario              = resultado[0].id_usuario;

              nombre_completo   = resultado2[0].nombre;

              id_grado          = resultado2[0].id_grado;
              id_colegio        = resultado2[0].id_colegio;
              id_ubigeo         = resultado2[0].id_ubigeo;
              coneccion.query('SELECT c1 FROM sm_colegio WHERE id="'+ resultado2[0].id_colegio +'"', function(error, resultado3, fila3){
                if(!error){
                  colegio = resultado3[0].c1;
                  // averiguamos en qué departamento esta el alumno
                  coneccion.query('SELECT * FROM ubigeo WHERE id="'+ resultado2[0].id_ubigeo +'"', function(error, resultado4, fila4){
                    if(!error){
                      departamento = resultado4[0].dep;
                      id_dep = resultado4[0].iddep;
                      id_pro = resultado4[0].idpro;
                      id_dis = resultado4[0].iddis;
                      if(nivel_acceso=="1"){
                        res.redirect('/principal');
                      }else if(nivel_acceso=="2"){
                        res.redirect('/profesor');
                      }
                    }else{
                      res.send("La información sobre el usuario no está completa - 3");
                      //res.send(error);
                    }
                  })
                }else{
                  //res.send(error);
                            res.send("La información sobre el usuario no está completa - 2");
                }
              })
          }else{
            //res.send(error)
            //res.send("La información sobre el usuario no está completa");
            console.log("La información sobre el usuario no está completa");
          }
        });
      }else{
        //res.send("El usuario no existe o sus datos son incorrectos");
        console.log("El usuario no existe o sus datos son incorrectos");
      }
    }else{
      console.log("Ocurrio un error: "+ error);
    }
  });
});

app.get('/salir', function(req, res){
  delete req.session.user;
  res.redirect('/');
});

conectados = new Array();

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

  var tot = conectados.length;
  conectados[tot] = {
      "nombre": nombre_completo, 
      "colegio": colegio, 
      "id_usuario": id_usuario, 
      "id_colegio": id_colegio, 
      "id_grado": id_grado, 
      "id_dep": id_dep, 
      "id_pro":id_pro, 
      "id_dis": id_dis, 
      "departamento": departamento
    }
  socket.emit('inicializar', {id_usuario: id_usuario, id_colegio: id_colegio, id_grado: id_grado, nombre_completo: nombre_completo, colegio: colegio, id_avatar: avatar, departamento: departamento, id_dep: id_dep, id_pro: id_pro, id_dis: id_dis, nivel_acceso: nivel_acceso});
  socket.broadcast.emit('lista_chat_completa', {"usuarios_chat": conectados })
  socket.emit('lista_chat_personal', {"usuarios_chat": conectados })

  socket.on('mensaje_chat_cliente', function (data) {
    socket.broadcast.emit('mensaje_chat_servidor', { "nombre": data.nombre, "colegio": data.colegio, "departamento": data.departamento, "mensaje": data.mensaje, "fecha": data.fecha, "hora": data.hora });
  });

  socket.on('nuevo_post_cliente', function (data){
    socket.broadcast.emit('nuevo_post_servidor', { id_dep: data.id_dep, id_pro: data.id_pro, id_dis: data.id_dis, id_grado: data.id_grado, id_avatar: data.id_avatar, comunidad: data.comunidad, id_colegio: data.id_colegio, id_titulo: data.id_titulo, id_usuario: data.id_usuario, nombre_completo: data.nombre_completo, colegio: data.colegio, departamento: data.departamento, texto: data.texto, id_post: data.id_post, fecha: data.fecha, hora: data.hora });
  });

  socket.on("disconnect", function(){
    for(i=0; i<conectados.length; i++){
      if(conectados[i].id_usuario==id_usuario){
        conectados.splice(i, 1);
      }
    }
    for(i=0; i<conectados.length; i++){
      console.log("Nombre: "+ conectados[i].nombre + " Colegio: " + conectados[i].colegio)
    }
    socket.broadcast.emit('lista_chat_completa', {"usuarios_chat": conectados })
  });
});

1 个答案:

答案 0 :(得分:1)

我的猜测是你的数据库调用是异步的。您的数据库是否在连接事件中调用?如果没有,你返回的可能不是你想要的。

你应该有类似的东西:

io.sockets.on ('connection', function (socket) {
  mysql.find($query, function(err, variable1) {  // This anonymous function is a callback.
    socket.emit('initialize', { username: variable1 });
  };
});