Parte 1. Registro de usuario Registrar un usuario
Materiales necesarios
- Node.js
- Express.js
Módulos de nodo utilizados
- Couchbase Node.js SDK/N1QL
- body-parser
- uuid
- node-forge
La parte más importante de la creación de una red social comienza con los usuarios. Si sólo tienes un directorio de personas, estás ante la forma más básica de una red social, donde la gente puede aprender unos de otros. De este modo, lo más importante que debe poder hacer un usuario es crear una cuenta. Después de este punto, el resto de nuestros retos se convierten en manipular este documento de usuario, o al menos algunos aspectos del mismo. Antes de profundizar en esto, permítanme explicar la estructura básica de archivos que existe en esta aplicación, que será crítica para entender cómo funciona Touchbase.
Estructura de archivos
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<span estilo="color: #f8f8f2">aplicación.js</span> <span estilo="color: #75715e">//contiene nuestra configuración básica para la aplicación</span> <span estilo="color: #f8f8f2">paquete.json</span> <span estilo="color: #75715e">//contiene los módulos de nodos necesarios para la aplicación</span> <span estilo="color: #f8f8f2">bower.json</span> <span estilo="color: #75715e">// contiene los componentes bower necesarios para la aplicación</span> <span estilo="color: #f8f8f2">config.json</span> <span estilo="color: #75715e">// contiene la información de configuración necesaria para la aplicación</span> <span estilo="color: #f92672">/</span><span estilo="color: #f8f8f2">rutas</span> <span estilo="color: #75715e">//contiene los puntos finales de la API para el nodo (donde se reciben los datos de back-end)</span> <span estilo="color: #f92672">--</span><span estilo="color: #f8f8f2">rutas.js</span> <span estilo="color: #f92672">/</span><span estilo="color: #f8f8f2">modelos</span> <span estilo="color: #75715e">//contiene todas las funciones para completar las operaciones de back-end, divididas por tipo</span> <span estilo="color: #f92672">--</span><span estilo="color: #f8f8f2">imagenmodelo.js</span> <span estilo="color: #f92672">--</span><span estilo="color: #f8f8f2">modelo de sesión.js</span> <span estilo="color: #f92672">--</span><span estilo="color: #f8f8f2">modelo estadístico.js</span> <span estilo="color: #f92672">--</span><span estilo="color: #f8f8f2">modelo de usuario.js</span> <span estilo="color: #f92672">--</span><span estilo="color: #f8f8f2">modelo de publicación.js</span> <span estilo="color: #f92672">--</span><span estilo="color: #f8f8f2">emailmodel.js</span> <span estilo="color: #f92672">/</span><span estilo="color: #f8f8f2">iconos</span> <span estilo="color: #75715e">//contiene todos nuestros iconos</span> <span estilo="color: #f92672">/</span><span estilo="color: #f8f8f2">bower_componentes</span> <span estilo="color: #75715e">//donde se guardan todos los componentes de bower usando bower install</span> <span estilo="color: #f92672">/</span><span estilo="color: #f8f8f2">node_modules</span> <span estilo="color: #75715e">//donde se almacenan todos los módulos de node usando npm install</span> <span estilo="color: #f92672">/</span><span estilo="color: #f8f8f2">público</span> <span estilo="color: #75715e">//donde se almacenan todos los materiales del front-end</span> <span estilo="color: #f92672">--</span><span estilo="color: #f8f8f2">js</span> <span estilo="color: #f92672">--</span><span estilo="color: #f8f8f2">html</span> <span estilo="color: #f92672">--</span><span estilo="color: #f8f8f2">índice.html</span> <span estilo="color: #f92672">--</span><span estilo="color: #f8f8f2">nav.html</span> |
Asumiré un conocimiento general de esta estructura de archivos, pero si eres nuevo en ella, consulta el tutorial de Nic Raboy sobre la creación de una API de juegos con Node.js y Couchbase. aquí.
En nuestra app.js habremos hecho gran parte de la configuración necesaria. Para este post, te pediré que primero te refieras a rutas/routes.js. Aquí encontrará el /api/registerUser endpoint. Para cualquiera que sea nuevo en Node.js o en aplicaciones basadas en APIs, un endpoint es simplemente donde una llamada a una API REST transmitirá sus datos al back-end. Por ejemplo, si yo hiciera algún tipo de petición http POST en el front-end a un endpoint llamado /api/registerUserPor ejemplo, podría enviar algunos datos de usuario a este endpoint, y éste realizaría las operaciones necesarias en el back-end (creando un documento de usuario) antes de transmitir de vuelta algún mensaje (típicamente, un objeto JSON).
API '/api/registerUser
En este caso, el /api/registerUser recibirá un objeto JSON que contendrá el contenido de un formulario que el usuario ha rellenado para registrarse en nuestro sitio, Touchbase. En el back-end Touchbase realiza algunas validaciones básicas para asegurarse de que la información necesaria del usuario ha sido introducida para esta cuenta para asegurarse de que puede ser utilizada como una cuenta legítima. Primero comprobamos que el objeto tiene nombre, email y contraseña. Todos estos se comprueban en el front-end también, y muestran mensajes de error, sin embargo, nunca es suficiente confiar en la validación del front-end. El javascript del front-end puede ser fácilmente manipulado por un usuario final, y podría exponer agujeros de seguridad en la aplicación. Teniendo esto en cuenta, la misma validación realizada en el front-end se realiza de nuevo en el back-end. Algunos campos se validan con expresiones regulares. Por ejemplo, para asegurarse de que la contraseña es lo suficientemente segura. A continuación, la contraseña se compara con la contraseña de confirmación para comprobar que son idénticas. El correo electrónico también se comprueba para asegurarse de que no se ha puesto ya en uso antes de utilizar User.advancedSearch (esta función se explicará en detalle próximamente). Si se cumplen todas estas condiciones, el Usuario.crear se ejecuta la función.
Para ver el 'Usuario.crear' vaya a models/usermodel.jso mire el siguiente fragmento. En este archivo verá una función llamada 'Usuario.crear'. Esta función se utiliza para generar un documento JSON que describe diferentes aspectos del usuario. Como puede observar, algunos de estos aspectos proceden directamente de la entrada del usuario, que se pasó a la función 'Usuario.crear' como 'params'y otros se generan al crear el documento sin que el usuario tenga que hacer nada. Por ejemplo, se crea un UUID (identificador único universal) aleatorio como ID del documento del usuario. aquí. Para ello, he utilizado el módulo de nodo uuid. Este ID de documento (UUID) debe ser una forma única de identificar al usuario para todos los propósitos futuros. Como queremos asegurarnos de que cada documento es completamente único, utilizamos un UUID, y como queremos asegurarnos de que el documento puede ser lo más flexible posible, evitamos utilizar cualquier atributo de uso particular como ID del documento. En el futuro, buscaremos a estos usuarios principalmente por atributo, y rara vez utilizaremos directamente estos UUID, a menos que sea en un caso en el que sepamos que estamos buscando a un usuario específico.
También queremos mantener la hora a la que se generó el documento de usuario, y mirar los inicios de sesión a lo largo del tiempo, así que usamos la hora actual, que generamos usando JavaScript, y luego insertamos esto en nuestro objeto anidado 'timeTracker'. Puedes notar que estas variables también están divididas de forma extraña por stringAttributes, dropdownAttributes y arrayAttributes. La razón de esto, es principalmente debido a cómo vamos a consultar estos atributos utilizando el lenguaje de consulta N1QL de Couchbase. Esto se explica en profundidad en parte 0 de la serie del blog, pero en esencia, la razón por la que está estructurado de esta manera es para permitir que el código se cambie muy poco para reutilizarlo. Dentro de login, también verás el atributo ' password' que es una versión hash de la contraseña que el usuario introdujo. Esto se hace usando node-forge.
Función 'User.create
Ahora utilizamos una sentencia de inserción N1QL para crear el documento. Si se produce un error, verás que se llama a una función callback. Notará que hay una llamada de retorno pasada como parámetro, que es la función function(error, resultado)' que se ve en el rutas/routes.js archivo. Esto se utiliza para evitar tener que escribir repetidamente la misma sintaxis para manejar el éxito y los errores. Si la inserción tiene éxito (el resultado que debería producirse), entonces el resultado se devolverá a la función rutas/routes.js para /api/registerUsery se seguirá utilizando para acciones posteriores. Después de esto vemos que se pasa a Sesión.makeVerification.
Consulta N1QL 'Insertar usuario
1 |
<span estilo="color: #66d9ef">INSERTAR</span> <span estilo="color: #66d9ef">EN</span> <span estilo="color: #f8f8f2">usuarios</span> <span estilo="color: #f8f8f2">(</span><span estilo="color: #66d9ef">CLAVE</span><span estilo="color: #f8f8f2">,</span> <span estilo="color: #f8f8f2">VALOR)</span> <span estilo="color: #66d9ef">VALORES</span> <span estilo="color: #f8f8f2">(</span><span estilo="color: #ae81ff">$1</span><span estilo="color: #f8f8f2">,</span> <span estilo="color: #ae81ff">$2</span><span estilo="color: #f8f8f2">);</span> |
La información que generamos en nuestro último resultado se creó en forma de un objeto JSON que contenía nuestro userID, y el documento de usuario, que se generaron con el método 'Usuario.crear' función. Para ver un ejemplo del documento que se introduciría, consulte parte 0. Esta información se utiliza para Sesión.makeVerification para generar un correo electrónico que se utiliza para verificar la dirección de correo electrónico del usuario. Si no, no podrán acceder a su cuenta.
Si te interesa dar este paso extra de verificación en tus cuentas, eso será discutido en el próximo post, parte 2, sobre verificación de email con Couchbase, Nodemailer y la API de Sengrid.
Gracias a todos por su tiempo, y espero que esto haya sido útil. Por favor, deje un comentario abajo con cualquier pregunta, comentario o crítica.
[...] hasta ahora, la Parte 0 y la Parte 1 cubren el modelo de datos y el documento de usuario utilizados en la aplicación, seguidas de la Parte 2 donde verificamos [...]