sábado, 25 de abril de 2020

Node.js 14 - Características nuevas

Node 14 acaba de ser lanzado (hace unos pocos días cuando se escribe el post) y tiene un par de características interesantes que quisiera compartir con ustedes (solo un resumen, puedes ver todas las características nuevas en https://nodejs.org/en/blog/release/v14.0.0/). Al grano!!!

1. Optional Chaining (Operador ?)

Era bastante moroso (tedioso, molesto, aburrido, etc.) estar validando una serie de propiedades de un objeto para estar seguros que existían.

Primero, el error común:

const obj = {
    atrib: {
        a: 1
    },
    otroAtrib: {
        a: 1
    }
};

// imprime 1 ya que la propiedad existe
console.log(obj.atrib.a);

// Ups, cannot read property "a" of undefined (error, tristes noticias)
console.log(obj.atribNoExiste.a);

Ahora la solución habitual (condiciones, condiciones, CONDICIONES!!!):

const obj = {
    atrib: {
        a: 1
    },
    otroAtrib: {
        a: 1
    }
};

if (obj !== undefined 
   && obj.atribNoExiste !== undefined
   && obj.atribNoExiste.a !== undefined) {
    console.log(obj.atribNoExiste.a);
} else {
    console.log("La propiedad necesaria no existe");
}

Y ahora un poco de magia...

const obj = {
    atrib: {
        a: 1
    },
    otroAtrib: {
        a: 1
    }
};

// Maravilla!!! no sería error, retornaría undefined
console.log(obj.atribNoExiste?.a);

console.log(obj.atribNoExiste?.otro.otro);

console.log(obj.otroAtrib?.b?.d);

El operador ? nos ayudará a evitar las condiciones del mal xD.

2. Null Coalescing (Operador ??)

La solución al problema de los valores nulos.

Primero, lo que se hacía comúnmente y que ocasionaba errores que encontré en muchos códigos fuente (el operador || suele utilizarse para dar valores "por defecto"):

function sumaCuatro(val) {
    // si val no existe, asignar el valor 10 (¿o no?)
    const num = val || 10;

    return num + 4;
}

// no mandamos ningún valor, el resultado sería 14
console.log(sumaCuatro());

// mandamos undefined, el resultado sería 14
console.log(sumaCuatro(undefined));

// mandamos 0, el resultado debería ser 4 pero será 14 :(
console.log(sumaCuatro(0));

El problema es que el operador || trabaja con valores falsy (https://developer.mozilla.org/en-US/docs/Glossary/Falsy), por lo tanto no solamente se asigna el valor por defecto cuando es null o undefined sino también cuando otro valor falsy es enviado (por ejemplo 0).

La solución (el esperado operador ??):

function sumaCuatro(val) {
    // si val no existe, asiganar el valor 10 (¿o no?)
    const num = val ?? 10;

    return num + 4;
}

// no mandamos ningún valor, el resultado sería 14
console.log(sumaCuatro());

// mandamos undefined, el resultado sería 14
console.log(sumaCuatro(undefined));

// mandamos 0, el resultado es 4 como debe ser!!!
console.log(sumaCuatro(0));

El operador ?? solamente asigna el valor por defecto en caso de que el valor comparado sea null o undefined.


3. Diagnostics

Se agregaron varias herramientas para diagnosticar tu aplicación en la versión 12 y ahora por fin son oficiales!!! Escribiré sobre estas herramientas en otro post porque es un poco más complejo y este es un post casual XD keep coding!!!