我请求你的支持...... 我有以下结构超级摘要:
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 })
});
});
答案 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 });
};
});