Un servidor de chat en tiempo real construido con Node.js, Express, Socket.IO y MongoDB. Permite comunicación instantánea entre usuarios y grupos con autenticación JWT.
- Autenticación de usuarios con JWT
- Chat en tiempo real usando Socket.IO
- Mensajería privada entre usuarios
- Grupos de chat con administradores
- Sistema de amigos con solicitudes
- Subida de imágenes con Cloudinary
- Búsqueda de mensajes y usuarios
- Estado en línea/desconectado de usuarios
- Indicador de escritura en tiempo real
- Historial de mensajes con paginación
- Node.js - Entorno de ejecución
- Express.js - Framework web
- Socket.IO - Comunicación en tiempo real
- MongoDB - Base de datos
- Mongoose - ODM para MongoDB
- JWT - Autenticación
- bcryptjs - Encriptación de contraseñas
- Cloudinary - Almacenamiento de imágenes
- Sharp - Procesamiento de imágenes
- Multer - Manejo de archivos
- Node.js (v14 o superior)
- MongoDB
- Cuenta de Cloudinary (para imágenes)
-
Clonar el repositorio
git clone <url-del-repositorio> cd chat-server
-
Instalar dependencias
npm install
-
Configurar variables de entorno
Copia el archivo
.env.examplea.envy configura las siguientes variables:PORT=3000 DB_URI=mongodb://localhost:27017/chat-db JWT_KEY=tu_clave_secreta_jwt CLOUD_NAME=tu_cloudinary_cloud_name API_KEY_CLOUDINARY=tu_cloudinary_api_key API_SECRET_CLOUDINARY=tu_cloudinary_api_secret
-
Iniciar el servidor
# Desarrollo npm run dev # Producción npm start
POST /new- Registrar nuevo usuarioPOST /- Iniciar sesiónGET /renew- Renovar token JWTPUT /changeName/:myId- Cambiar nombre de usuarioPUT /changePassword/:myId- Cambiar contraseñaPOST /changePerfil/:myId- Cambiar foto de perfilPUT /update-username- Actualizar nombre de usuarioPOST /get-found-users- Buscar usuariosPOST /add-friend- Agregar amigoPOST /friend-request- Enviar solicitud de amistadGET /get-user- Obtener información del usuarioPOST /get-simple-user- Obtener información básica del usuario
GET /:from- Obtener mensajes de una conversaciónGET /find/:from- Buscar mensajes específicosGET /position/:from- Obtener posición de un mensaje
POST /create- Crear nuevo grupoPOST /group-perfil/:groupId- Cambiar foto del grupo
main-connection- Conectar usuario con token JWTinbox-message- Enviar mensajewriting- Indicar que el usuario está escribiendostate- Solicitar estado de usuarios y gruposuser-change- Notificar cambio de usuarioupdate-users- Actualizar lista de usuariosconnect-to-group- Conectar a un grupo
inbox-message- Recibir nuevo mensajewriting- Notificación de usuario escribiendostate- Actualización de estado generaluser-list- Lista de usuarios conectadosgroup-list- Lista de grupos del usuariouser-change- Notificación de cambio de usuarioupdate-users- Actualización de lista de usuarios
chat-server/
├── controllers/ # Controladores de la aplicación
│ ├── auth.js # Autenticación y usuarios
│ ├── group.js # Gestión de grupos
│ ├── messages.js # Gestión de mensajes
│ └── sockets.js # Eventos de Socket.IO
├── database/ # Configuración de base de datos
│ └── config.js # Conexión a MongoDB
├── helpers/ # Funciones auxiliares
│ ├── cloudinary.js # Configuración de Cloudinary
│ └── jwt.js # Manejo de JWT
├── middlewares/ # Middlewares personalizados
│ ├── fieldValidator.js # Validación de campos
│ └── validateJWT.js # Validación de JWT
├── models/ # Modelos de datos
│ ├── groupModel.js # Modelo de grupos
│ ├── messageModel.js # Modelo de mensajes
│ ├── server.js # Configuración del servidor
│ ├── sockets.js # Configuración de sockets
│ └── userModel.js # Modelo de usuarios
├── public/ # Archivos estáticos
│ └── index.html # Página de inicio
├── routes/ # Definición de rutas
│ ├── auth.js # Rutas de autenticación
│ ├── group.js # Rutas de grupos
│ └── messages.js # Rutas de mensajes
├── .env.example # Ejemplo de variables de entorno
├── .gitignore # Archivos ignorados por Git
├── index.js # Punto de entrada
└── package.json # Dependencias y scripts
{
name: String,
email: String (único),
password: String (encriptado),
userName: String,
friends: Array,
requests: Array,
requestSended: Array,
imageUrl: {
extraSmall: String,
small: String,
medium: String
},
online: Boolean
}{
from: ObjectId (ref: User),
to: ObjectId (ref: User),
message: String,
createdAt: Date,
updatedAt: Date
}{
name: String,
admin: ObjectId (ref: User),
imageUrl: {
extraSmall: String,
small: String,
medium: String
},
users: Array
}- Autenticación JWT para todas las rutas protegidas
- Encriptación de contraseñas con bcryptjs
- Validación de campos con express-validator
- CORS configurado para solicitudes cross-origin
- Validación de tipos de archivo para subida de imágenes
-
Variables de entorno de producción
- Configura todas las variables de entorno necesarias
- Usa una base de datos MongoDB en la nube (MongoDB Atlas)
- Configura Cloudinary para producción
-
Construir y ejecutar
npm start
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
Este proyecto está bajo la Licencia ISC.
Si tienes alguna pregunta o problema, por favor abre un issue en el repositorio.
Desarrollado con ❤️ usando Node.js y Socket.IO