# Proyecto Hola Usuario

## Descripción

*   Realizar un programa que escriba en un fichero el texto siguiente:

    ```bash
    Hola usuario, tienes 25 años
    ```

    *   Usuario se obtendrá de la variable de entorno

        ```bash
        $USERNAME
        ```
    * La edad se obtendrá de una variable

## Objetivos

* Entender el funcionamiento de los módulos
  * Utilizar módulos del núcleo (os, fs)
  * Crear un módulo sencillo
* Usar sintaxis de ES6 ([_destructuring_](https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Operadores/Destructuring_assignment) y [_template string_](https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/template_strings))

## Comenzar proyecto

```bash
mkdir holaUsuario
cd holaUsuario
touch app.js
code .
```

## Añadir texto a un fichero

* Función asíncrona:

```javascript
console.log('Iniciando app');
const fs = require('fs');
// fs es un objeto con muchas funciones, ver api
fs.appendFile('saludo.txt', 'Hola Usuario');
```

* Salida con warning:

```javascript
(node:9493) [DEP0013] DeprecationWarning: Calling an asynchronous function without callback is deprecated.
```

* ¡Recoger error o éxito con función de callback para evitar warning!

```javascript
console.log('Iniciando app');
const fs = require('fs');
// fs es un objeto con muchas funciones, ver api
fs.appendFile('saludo.txt', 'Hola Usuario', (err)=>{
  err ? console.log('Ha habido un error') : console.log('Todo ok');
});
```

* Podríamos utilizar también una función síncrona:

```javascript
console.log('Iniciando app');
const fs = require('fs');
try {
  fs.appendFileSync('saludo.txt', 'Hola usuario');
  console.log('Todo ok!');
} catch (err) {
  console.log('Ha habido un error');
}
```

## Obtener el nombre del usuario

* Utilizaremos el módulo OS para averiguar el nombre del usuario

```javascript
const os = require('os');
const user = os.userInfo();
console.log(user); // para ver que datos tiene userInfo()
```

## Implementación ES5

```javascript
const fs = require('fs');
const os = require('os');
const user = os.userInfo();

console.log('Iniciando app');
const saludo = 'Hola ' + user.username;
fs.appendFile('saludo.txt', saludo, function (err) {
  err ? console.log('Ha habido un error') : console.log('Todo ok');
});
```

## ES6: Destructuring

* Mapeamos una o varias partes de un objeto a una o varias variables:

```javascript
let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
console.log(x); // 1
console.log(y); // 2
console.log(z); // { a: 3, b: 4 }
```

## ES6: Template Strings

```javascript
var a = 5;
var b = 10;
console.log(`Fifteen is ${a + b} and not ${2 * a + b}.`);
// "Fifteen is 15 and not 20."
```

## ES6: Object Literal Property Value Shorthand

* Antes (ES5):

```javascript
function createMonster(name, power) {
  return { type: 'Monster', name: name, power: power };
}
```

* Ahora (ES6):

```javascript
function createMonster(name, power) {
  return { type: 'Monster', name, power };
}
```

## Implementación ES6

```javascript
const fs = require('fs');
const os = require('os');
const { username } = os.userInfo();

console.log('Iniciando app');
const saludo = `Hola ${username}`;
fs.appendFile('saludo.txt', saludo, (err) => {
  err ? console.log('Ha habido un error') : console.log('Todo ok');
});
```

## Uso de módulos

* Vamos a crear un módulo que sea el encargado de proporcionarnos el usuario
*   Creamos el fichero user.js con el siguiente texto:

    ```javascript
    console.log('Cargando módulo para el usuario');
    ```
*   ¿Cómo lo cargamos dentro de nuestro app.js?

    ```
    const user = require ('./user.js')
    ```
* Comprobamos la ejecución que muestra el texto del módulo requerido por consola.

## Uso de variables y funciones de otro módulo en node

* El objeto module tiene muchas propiedades, nos interesará **module.exports**

```javascript
console.log(module)
```

* module.exports puede ser una función, un objeto, un string...
* Será ahí donde tendremos que crear un objeto con el nombre del usuario y la edad.

## Solución proyecto

* Fichero app.js:

```javascript
const fs = require('fs');
const os = require('os');
console.log('Iniciando app');

const { username, edad } = require('./user')

const saludo = `Hola ${username}, tienes ${edad} años`;
fs.appendFile('saludo.txt', saludo, (err) => {
  err ? console.log('Ha habido un error') : console.log('Todo ok');
});
```

* Módulo user.js:

```javascript
const { username } = require('os').userInfo()
const edad = 25;
module.exports = { username, edad }
```

## Ejercicio carga módulos

* ¿Qué mostraría el siguiente programa?
* ¿Y si comentamos la primera línea de app.js?

app.js:

```javascript
require('./module1');
require('./module2');
console.log('Iniciando app');
```

module1.js:

```javascript
console.log('Ejecutando módulo 1');
```

module2.js:

```javascript
require('./module1')
console.log('Ejecutando módulo 2');
```

## Salida ejercicio

* El texto _Ejecutando módulo 1_ se muestra solo una vez
  * Ya está cargado previamente, se usa la caché y no se ejecuta
  * El texto _Inicializando app_ sale después del console.log de los require (los require son síncronos).

## Ejercicio leer ficheros

* Crea dos ficheros numero1.txt y numero2.txt y escribe un número en cada uno
* Crea un programa que:
  * Lea el contenido de los dos fichero y lo almacene en variables
  * Muestre por consola la suma de las variables

## Solución lectura ficheros

```javascript
const fs = require('fs')
const numero1 = fs.readFileSync('./numero1', 'utf-8')
const numero2 = fs.readFileSync('./numero2', 'utf-8')
console.log(`El resultado de la suma es  ${parseInt(numero1)+parseInt(numero2)}`)
```
