Ha pasado mucho tiempo y he me quedado estancado ordenando el código e integrando controles con JSON Web Token para verificar usuarios en las funciones de la aplicación.
Lo dejaré en pausa, mientras estudio un poco más de TypeScript, que he me hace falta. Definitivamente no he terminado con la aplicación, me falta evaluar mejor los roles para permitir el acceso a ciertas aplicaciones. Pero el código está disponible en GitHub - Youtube intro to Knex para quien desee reir un rato por mi pésimo código
Blog acerca de la realidad nacional, internet y las cosas que haga, nada especial.
jueves, 28 de junio de 2018
jueves, 31 de mayo de 2018
Jugando con Knex - parte 3
Al salir el error: Error: ER_TABLE_EXISTS_ERROR: Table 'login' already exists, la mejor opción es borrar las tablas manualmente.
Para añadir nuevas funciones al sistema, se está creando una tabla más, 'login', y cambiando el contenido de la tabla 'users' que contendrá información del usuario. Parece que debido al enlace entre las tablas 'users' y 'todos' no es tan sencillo borrar e incluir las nuevas tablas, pero luego de borrar las tablas manualmente con phpMyAdmin, el proceso con Knex se puede hacer sin problemas.
Para añadir nuevas funciones al sistema, se está creando una tabla más, 'login', y cambiando el contenido de la tabla 'users' que contendrá información del usuario. Parece que debido al enlace entre las tablas 'users' y 'todos' no es tan sencillo borrar e incluir las nuevas tablas, pero luego de borrar las tablas manualmente con phpMyAdmin, el proceso con Knex se puede hacer sin problemas.
martes, 15 de mayo de 2018
Jugando con Knex - Parte 2
Siguiendo con la lucha. Al ejecutar el filtrado de TODOS por id de usuario, Knex devuelve un resultado malformado. El id de la respuesta absorve el valor del id del usuario y la lista no se puede identificar adecuadamente, no está ordenado por el id de TODOS.
Resultado:
Comprobé el error en phpMyAdmin, ejecutando el código SQL:
SELECT * FROM `todos` INNER JOIN `users` ON `todos`.`user_id` = `users`.`id` WHERE `todos`.`user_id` = 3
Donde se muestran todas las columnas de las tablas.
Para corregir el problema, escogí establecer las columnas que debería devolver Knex, como en este SQL:
SELECT `todos`.`id`, `todos`.`title`, `todos`.`completed`, `todos`.`created_at`, `todos`.`updated_at`, `users`.`name`, `users`.`email` FROM `todos` INNER JOIN `users` ON `todos`.`user_id` = `users`.`id` WHERE `todos`.`user_id` = 3
Para eso se usa .column. Ciertamente más sencillo de construir con Knex que con SQL y el backtick.
El resultado es diferente:
Resultado:
[{
"id":3,
"title":"go to the gym",
"completed":0,
"created_at":"2018-05-10T03:33:42.000Z",
"updated_at":"2018-05-10T03:33:42.000Z",
"name":"Someone Else ",
"email":"test3@test.com"
},
{
"id":3,
"title":"stop the damn leafblowers",
"completed":0,
"created_at":"2018-05-10T03:33:42.000Z",
"updated_at":"2018-05-10T03:33:42.000Z",
"name":"Someone Else ",
"email":"test3@test.com"
},
{
"id":3,
"title":"get the mail",
"completed":0,
"created_at":"2018-05-10T03:33:42.000Z",
"updated_at":"2018-05-10T03:33:42.000Z",
"name":"Someone Else ",
"email":"test3@test.com"
},
{
"id":3,
"title":"get some headphones",
"completed":0,
"created_at":"2018-05-10T03:33:42.000Z",
"updated_at":"2018-05-10T03:33:42.000Z",
"name":"Someone Else ",
"email":"test3@test.com"
}]
Comprobé el error en phpMyAdmin, ejecutando el código SQL:
SELECT * FROM `todos` INNER JOIN `users` ON `todos`.`user_id` = `users`.`id` WHERE `todos`.`user_id` = 3
Donde se muestran todas las columnas de las tablas.
Para corregir el problema, escogí establecer las columnas que debería devolver Knex, como en este SQL:
SELECT `todos`.`id`, `todos`.`title`, `todos`.`completed`, `todos`.`created_at`, `todos`.`updated_at`, `users`.`name`, `users`.`email` FROM `todos` INNER JOIN `users` ON `todos`.`user_id` = `users`.`id` WHERE `todos`.`user_id` = 3
Para eso se usa .column. Ciertamente más sencillo de construir con Knex que con SQL y el backtick.
El resultado es diferente:
[{
"id":3,
"title":"go to the gym",
"completed":0,
"created_at":"2018-05-10T03:33:42.000Z",
"updated_at":"2018-05-10T03:33:42.000Z",
"name":"Someone Else ",
"email":"test3@test.com"
},
{
"id":4,
"title":"stop the damn leafblowers",
"completed":0,
"created_at":"2018-05-10T03:33:42.000Z",
"updated_at":"2018-05-10T03:33:42.000Z",
"name":"Someone Else ",
"email":"test3@test.com"
},
{
"id":5,
"title":"get the mail",
"completed":0,
"created_at":"2018-05-10T03:33:42.000Z",
"updated_at":"2018-05-10T03:33:42.000Z",
"name":"Someone Else ",
"email":"test3@test.com"
},
{
"id":6,
"title":"get some headphones",
"completed":0,
"created_at":"2018-05-10T03:33:42.000Z",
"updated_at":"2018-05-10T03:33:42.000Z",
"name":"Someone Else ",
"email":"test3@test.com"
}]
lunes, 7 de mayo de 2018
Jugando con Knex - Parte 1
Siguiendo con la lucha para dominar JS, TypeScript, Node y poder manipular RDBMS.
Encontré este ejemplo con knex[GitHub], haciendo las respectivas modificaciones para usar MySQL en lugar de PostgreSQL, pero he estado sufriendo para poder ejecutarlo correctamente.
Usando el código tal cual, sale el siguiente error:
Encontré este ejemplo con knex[GitHub], haciendo las respectivas modificaciones para usar MySQL en lugar de PostgreSQL, pero he estado sufriendo para poder ejecutarlo correctamente.
Usando el código tal cual, sale el siguiente error:
~knex-intro/youtube-intro-to-knex/db> knex migrate:make create_users_and_todos_tablesEl error se encuentra en el archivo knexfile.js, ya que al cambiarlo por lo que tengo disponible, el error no es visible. Y también por que encontré que el autor consultó al respecto: Knex migrate and seed CLI commands throwing error [Github]. Aplicando el cambio requerido, no hay problema en la ejecución del comando.
module.js:471
throw err;
^
Error: Cannot find module './dialects/[object KnexClient]/index.js'
at Function.Module._resolveFilename (module.js:469:15)
at Function.Module._load (module.js:417:25)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Knex (/home/ikari/workshop/OWN/knex-intro/youtube-intro-to-knex/node_modules/knex/lib/index.js:55:15)
at initKnex (/usr/local/share/.config/yarn/global/node_modules/knex/bin/cli.js:69:10)
at Command.(/usr/local/share/.config/yarn/global/node_modules/knex/bin/cli.js:116:22)
at Command.listener (/usr/local/share/.config/yarn/global/node_modules/commander/index.js:315:8)
at emitTwo (events.js:106:13)
at Command.emit (events.js:191:7)
at Command.parseArgs (/usr/local/share/.config/yarn/global/node_modules/commander/index.js:651:12)
at Command.parse (/usr/local/share/.config/yarn/global/node_modules/commander/index.js:474:21)
at Liftoff.invoke (/usr/local/share/.config/yarn/global/node_modules/knex/bin/cli.js:186:13)
at Liftoff.execute (/usr/local/share/.config/yarn/global/node_modules/liftoff/index.js:203:12)
at module.exports (/usr/local/share/.config/yarn/global/node_modules/flagged-respawn/index.js:51:3)
at Liftoff.(/usr/local/share/.config/yarn/global/node_modules/liftoff/index.js:195:5)
at /usr/local/share/.config/yarn/global/node_modules/liftoff/index.js:165:9
at /usr/local/share/.config/yarn/global/node_modules/v8flags/index.js:108:14
at /usr/local/share/.config/yarn/global/node_modules/v8flags/index.js:35:14
at /usr/local/share/.config/yarn/global/node_modules/v8flags/index.js:47:7
at _combinedTickCallback (internal/process/next_tick.js:73:7)
at process._tickCallback (internal/process/next_tick.js:104:9)
jueves, 8 de marzo de 2018
openSuSE Leap 42.3 + Redis
Y una nueva aventura, instalando Redis en openSuSE Leap no podría ser más sencillo ya que Redis está disponible en los repositorios de la distribución.
Sin embargo para arrancarlo no basta con:
systemctl start redis.target
que parece no tuvo uso. Recien cuando ejecuté:
sudo redis-server
arrancó el servicio y pude tener acceso al cliente
redis-cli
Sin embargo el servidor presentó los siguientes mensajes:
WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
...
WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
* The server is now ready to accept connections on port 6379
Las instrucciones están incluidas, pero si da flojera leer, StackOverflow tiene algo de información, aquí: Tech and me - Performance tips for Redis Cache Server
Para el primer mensaje:
WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
Se debe escribir en consola:
sysctl -w net.core.somaxconn=65535
pero para ahorrarse el trabajo de tener que hacerlo cada vez que se inicia el sistema, se debe editar el archivo:
/etc/rc.d/boot.local
Para el segundo mensaje:
WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
se require editar el archivo:
/etc/sysctl.conf
para añadir la línea solicitada:
vm.overcommit_memory=1
Para la tercera línea:
WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot.
Se necesita editar nuevamente el archivo:
/etc/rc.d/boot.local
y añadir la línea:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
El texto continúa con una descripción para dejar de usar TCP, puerto 6379, y usar el socket UNIX, "transmisión interna", para acelerar la respuesta en caso de que el servidor Redis se encuentre en el mismo equipo del cliente. Lo cual preferí no llevar a cabo.
Es recomendable revisar el tutorial interactivo disponible en la web de Redis. Es una manera sencilla para conocer la mayoría de comandos de Redis y la imortancia de los hashes.
Tomar en consideración que para la edición de los archivos necesarios para la ejecución correcta de Redis, es necesario disponer de permisos de usuario root, (
su -
) y saber usar un editor como nano o vim facilita el trabajo.
martes, 27 de febrero de 2018
[Fullstack] Node + PostgreSQL
No es que haya falta de documentación, pero no está organizada.
Hay información para crear API de NodeJS con PostgreSQL:
RisingStack - Node Hero: Node.JS Database Tutorial, pero no está actualizada para usar versiones de la librería pg (Node) actualizada. Lo que varia la sintaxis a usar. Pero los comentarios de ese artículo ayudan a:
- completar los requerimientos para usar el tutorial
- obtener información para corregir los problemas en la sintaxis
- extender recursos para probar la aplicación
También se encontró otro recurso, similar al mencionado primero, pero este no es parte de un tutorial para aprender del uso de Node.JS. Este enseña a usar Node.JS con la librería "pg" para crear un API REST que se comunicará con un frontend Angular JS: PostgreSQL and NodeJS.
Sin embargo, hasta el momento no he encontrado casualmente información de las partes y condiciones para un sistema API REST que proporcione CRUD.
También me hace falta repasar la parte de Angular (Angular 5) para proporcionar una interfaz adecuada y que optenga los datos necesarios del sistema API.
Suscribirse a:
Entradas (Atom)