NVM “Node version manager”. Este es el gestor de versiones para NodeJs, permite tener diferentes versiones de NodeJs instaladas en tu ordenador y poder ir utilizando la que necesites en cada momento con un solo comando.
Voy a explicar como hay que hacer la instalación en el orden correcto en Windows para no tener problemas y que todo funcione correctamente.
Step 1.a
Debemos desinstalar todas las versiones que tengamos de NodeJs y npm en nuestro ordenador, para ello vamos a la barra de tareas, en la parte inferior izquierda donde pone “Búsqueda” e introducimos el texto “agregar o quitar programas”. Seleccionamos esa opción en la ventana de la búsqueda. En la ventana que se nos abre localizamos NodeJs y lo desinstalamos.
Step 1.b
Una vez realizado el paso anterior, en vamos a limpiar las variables de entorno de todo rastro de NodeJs y npm. Para ello hacemos la búsqueda igual que en el paso anterior pero esta vez buscamos “editar variables de entorno del sistema”. En la ventana que se nos abre de las propiedades del sistema hacemos clic en “variables de entorno”. En la sección de variables del sistema seleccionamos la linea donde pone “Path”, hacemos clic en editar y en la ventana que se nos abre buscamos las lineas relacionadas con NodeJs y npm y las eliminamos.
Step 1.c
Reiniciamos el equipo para que los cambios que hemos realizado surtan efecto.
Step 1.d
En este paso vamos a rastrear la siguiente lista de directorios y vamos a eliminarlos para no dejar ni rastro de NodeJs y npm. Si no hacemos esto correctamente , NVM va a ver que ya existen y no va realizar la instalación de forma apropiada. Para poder realizar este paso hay que habilitar la opción “Mostrar archivos ocultos y del sistema”. Para ello hacemos lo mismo que en los pasos anteriores, buscamos la opción en la barra de tareas donde pone “Búsqueda”.
Step 2
Ya hemos realizado la limpieza a fondo de NodeJs y npm. Ahora vamos a instalar NVM, para ello descargamos el instalador de la página de GitHub desde el siguiente enlace. Elegimos la versión ejecutable “nvm-setup.exe”. Una vez descargada, ejecutamos el archivo y seguimos las instrucciones de la instalación sin modificar ninguna configuración. Para comprobar que todo ha ido bien, abrimos una consola, introduciendo “CMD” en la barra de tareas donde pone Búsqueda. Una vez abierta la consola introducimos el comando “nvm” y presionamos Enter. Nos debe salir algo parecido a la siguiente imagen.
En mi caso la versión que he instalado es la 1.1.10.
Step 3.
Seguidamente vamos a proceder a instalar las versiones que queramos de NodeJs. Si deseamos saber las versiones disponibles de NodeJs, podemos verlo en el siguiente enlace.
Para la instalación, en mi caso necesito las versiones 18.15.0, 16.20.0, 14,21.3 y 12.22.12, lo hacemos con los siguientes comandos.
Para ver la lista de versiones disponibles de NodeJs de las que disponemos utilizamos el comando “nvm list”.
Step 4.
Nos falta seleccionar la versión que deseamos utilizar, por ejemplo la 16.20.0, para ello usamos el comando “nvm use 16.20.0”. Seguido utilizamos el comando “nvm list” para comprobar que se ha seleccionado la versión deseada. Este paso debería mostrar lo mismo que la imagen siguiente.
Step 5.
Para finalizar, con los comandos “node -v” y “npm -v” podemos ver las versiones que estamos utilizando de NodeJsynpm y que hemos seleccionado en el paso anterior.
Anexo
Si deseamos desinstalar alguna de las versiones porque ya no la necesitamos, por ejemplo la versión 12.22.12, utilizaremos el comando “nvm uninstall 12.22.12”.
Los objetos String son inmutables, esto puede suponer una gran diferencia con respecto a StringBuilder y StringBuffer que si que son mutables. Cuando trabajas con Strings nunca se muta el objeto original, se crea un objeto nuevo y cambia la referencia de memoria de la variable a ese nuevo objeto. El objeto original queda sin referencia a ninguna variable y el recolector de basura de java se encarga de destruirlo. Esto cuando se trata de trabajar con muchos nuevos objetos puede provocar un retardo en la ejecución del proceso.
Con StringBuilder o StringBuffer esto no sucede porque son objetos mutables, es decir, no se crea un nuevo objeto cada vez que manipulamos la cadena guardada en StringBuilder o StringBuffer, por tanto tampoco cambia la referencia al espacio de memoria asignado a la variable de la cadena.
Con String saludo = “Hola”; estamos creando la variable saludo que crea un objeto y apunta a una posición de memoria.
Con saludo = saludo + “ Luis”; estamos concatenamos el nombre de Luis a lo que contiene la variable saludo, en este caso Hola, pero esto no esta modificando el valor de la variable saludo sino está creando un nuevo objeto que va a guardar dicha concatenación y va a apuntar a la posición de memoria de la variable saludo. Ahora el objeto anterior que guarda la cadena Hola ha quedado sin referencia a ninguna posición de memoria, no lo vamos a usar nunca más pero hasta que el recolector de basura de java lo elimine, va a seguir consumiendo recursos innecesarios.
Por el contrario con StringBuilder o StringBuffer esto no pasa, solo se modifica el objeto original y siempre apunta a la misma posición de memoria.
Ejemplo:
StringBuilder saludo = new StringBuilder("Hola");
saludo.append(" Luis");
StringBuilder y StringBuffer son casi iguales. StringBuffer puede ser usado en programas concurrentes, lo que se conoce como “thread safe”. Esto hace que StringBuilder sea más eficiente en programas no concurrentes.
Por tanto, si vamos a trabajar intensamente con cadenas, es mucho mejor utilizar StringBuilder y StringBuffer en lugar de String.
Aquí dejo unos pequeños tips de cosas a tener en cuenta a la hora de poner buenos nombres a clases, variables, métodos, etc.. cuando estamos desarrollando.
Técnicas para elegir nombres
Pronunciables.
En inglés.
Tan largos como sea necesario.
Índices de los bucles i,j,k.
Evitar reflejar información sobre los tipos en el nombre.
Interface de una sola clase, no por norma, a veces sí, a veces no.
El nombre de una variable, entender para qué se usa.
No añadir información técnica al nombre.
No utilizar sufijos.
¿Para qué es? buena pregunta para crear un buen nombre.
Evita prefijos, sufijos y cualquier otra palabra con información sobre la naturaleza técnica de la abstracción.
Nombres concretos: pensar si un nombre es aplicable a muchos elementos a la vez, en cuyo caso quizás debamos descartarlo.
Cada línea de código sea lo más parecida a una frase con sentido en lenguaje natural.
Utilizar prefijos de tipo pregunta, para expresiones o variables tipo boolean: is, has, does, are, contains, will, should… Incluso a veces se utilizan las negaciones isNot, doesnt, hasnt…,
And, Or, no se utilizan, si denota dos comportamientos huele a tener que ser refactirizado.
Prefijo is para las expresiones booleanas
Los sinónimos y las traducciones son innecesarias, introducen una indirección que dificulta la lectura.
El nombre de un método debe apoyarse en el contexto proporcionado por el nombre de su clase, así como por los nombres de sus argumentos y sus tipos.
Los tipos específicos atraen nombres de variables acordes a ellos, además de comportamiento.
Cuantos menos parámetros tenga un método, más probabilidad hay de que su implementación quede simple y de que tenga una única responsabilidad.
Si un método no devuelve nada, es porque va a alterar el sistema, ya sea modificando los argumentos, el estado interno de la clase, la base de datos, la cola de mensajes… por tanto es recomendable poner nombres con un tono imperativo.
Distinguir sustantivos, verbos y adjetivos: usamos sustantivos para nombres de clase/módulo/paquete y verbos para nombres de método/función.
Practicar TDD ayuda a nombrar
Mantener una cierta homogeneidad en la forma de implementar, suele producir mejores resultados que programar de manera arbitraria cada bloque de código.
Los verbos responden a la pregunta de «¿qué hace?», mientras que los sustantivos responden a la pregunta de ¿qué es?, y a veces también a la pregunta de ¿para qué es?
Este error me ocurrió al conectar el Frontend al Backend en localhost por culpa de CORS.
SOLUCIÓN:
Instalar una extensión en Chrome llamada Allow CORS que engaña al navegador desactivando el cors y haciendo posible la recepción de la petición al Backend correctamente.
Iniciar nuevo proyecto con Express y TypeScript desde cero. Para ello utilizo de guÍa el siguiente enlace. Desde el principio he tenido que buscar soluciones, me daba errores con los permisos de la carpeta donde había iniciado el proyecto, una vez solucionado esto encontré el obstáculo de la versión de node que tenía instalada, superado llegó lo peor y no era la asincronía, fue el CORS. Vi el error desde el principio pero no tomé la solución correcta. Pensé todo el tiempo en solucionarlo añadiendo dependencias y modificando el código del backend, pero estaba equivocado. Aunque con mi estrategia conseguí eliminar el error de la consola solo fue un espejismo, retornaba un objeto que no era lo que esperaba recibir y tenía una URL vacía que me engañó aún más. Después de una reunión con Kevin y los compañeros de practicas, que aprovechamos para hacer Mob Programming, estuvimos haciendo pruebas, dando nuestra opinión de lo que estaba pasando y haciendo de Driver en mi Pc, por fin vimos la luz. Fue una sesión corta pero genial para todos aprender del problema
SOLUCIÓN:
Instalar una extensión en Chrome llamada Allow CORS que engaña al navegador desactivando el cors y haciendo posible la recepción de la petición al Backend correctamente.