Sistemas y Tecnologías Web: Servidor

Master de II. ULL. 1er cuatrimestre


Organization ULL-MII-SYTWS-2122   Classroom ULL-MII-SYTWS-2122   Campus Virtual SYTWS   Chat Chat   Profesor Casiano

File System with Node.JS

Descripción de la práctica filesystem in node.js

Este es un ejemplo similar a los ejemplos que encontrará en el capítulo edl libro con la diferencia de que usamos la librería commander.js para procesar los argumentos:

1
[~/.../sol-nodejs-the-right-way/filesystem-chapter-2(master)]$ cat watcher-fortifying-code.js 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env node
'use strict';
const fs = require("fs");
const program = require('commander');
const { version, description } = require('./package.json');

program
    .version(version)
    .description(description)
    .usage('[options]')
    .option('-f, --file <fileToWatch>', 'set the file or directory to watch', '.')

program.parse(process.argv);

const fileToWatch = program.file;

try {
  fs.watch(fileToWatch, { recursive: true }, (eventType, fileName) => {
    console.log(`File ${fileName} changed! Event Type: ${eventType}`);
    if (eventType === 'rename' && fileToWatch === fileName) {
      console.error(`No longer watching ${fileToWatch}!`);
      process.exit(1);
    }
  });
  console.log(`Now watching ${fileToWatch} for changes ...`);
} catch(e) {
   if (e.code === "ENOENT") console.error(`No file '${fileToWatch}' found`);
   else console.error(e)
}

Veamos un ejemplo de ejecución cuando no se pasan argumentos:

1
2
3
[~/.../sol-nodejs-the-right-way/filesystem-chapter-2(master)]$ node watcher-fortifying-code.js 
Now watching . for changes ...
^C

Podemos usar la opción --help:

1
2
3
4
5
6
7
8
9
$ node watcher-fortifying-code.js --help
Usage: watcher-fortifying-code [options]

watch a file or directory for changes

Options:
  -V, --version             output the version number
  -f, --file <fileToWatch>  set the file or directory to watch (default: ".")
  -h, --help                output usage information

La opción -V:

1
2
$ node watcher-fortifying-code.js -V
1.0.0

El programa se nutre para la versión de la que está en el fichero package.json:

1
2
3
$ jq .version,.description  package.json 
"1.0.0"
"watch a file or directory for changes"

Si le pasamos la opción -f:

1
2
3
4
5
$ node watcher-fortifying-code.js -f target.txt
No file 'target.txt' found
[~/.../sol-nodejs-the-right-way/filesystem-chapter-2(master)]$ touch target.txt
[~/.../sol-nodejs-the-right-way/filesystem-chapter-2(master)]$ node watcher-fortifying-code.js -f target.txt
Now watching target.txt for changes ...

Ejercicio

  • Mejore este ejemplo añadiendo una opción -r --recursive que indica si watch debe hacer una vigilancia recursiva.

The fs.watch API is not 100% consistent across platforms, and is unavailable in some situations. The recursive option is only supported on macOS and Windows. Para sistemas Linux es conveniente utilizar un wrapper como node-watch.

Ejercicios

  • Resuelva los problemas en la secciones Fortifying the code y Expanding Functionality del capítulo Wrangling the File System
    • In the file-watching examples, what happens if the target file doesn’t exist?
    • What happens if a file being watched gets deleted?
    • How would you take the process to spawn from process.argv?
    • How would you pass an arbitrary number of additional parameters from process.argv to the spawned process?
      • node watcher-spawn-cmd.js target.txt ls -l -h
    • Use la librería commander.js

Visual Studio Code y git

Tablero Kanban

  • Cree un tablero GitHub del tipo Kanban Automatizado. Convierta en incidencias los requisitos y proceda a moverlos entre los paneles conforme progresa.
  • En el repo que entrega deberán figurar los ejemplos del libro y los ejercicios resueltos.

  • En el repo que entrega deberán figurar los ejemplos del libro y los ejercicios resueltos.

En el README.md escriba un tutorial sobre lo que ha aprendido. Muestre imágenes o vídeos de su desarrollo con Visual Studio Code.

Recursos

Q & A

A que se refiere la pregunta “Instead, how would you take the process to spawn from process.argv?”

En el fichero watcher-spawn.js se hace un spawndel comando ls:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
"use strict";
const
    fs = require('fs'),
    // The child_process module provides the ability to spawn child processes in a manner that is similar, but not identical, to popen
    spawn = require('child_process').spawn,
    filename = process.argv[2];

if (!filename) {
    throw Error("A file to watch must be specified!");
}

fs.watch(filename, function(eventType, fN) {
   
    let ls = spawn('ls', ['-lh', fN]);
    console.log(ls.pid);
    console.log(eventType, fN);
   
    ls.stdout.pipe(process.stdout);
});

console.log("Now watching " + filename + " for changes...");

lo que pide la pregunta es escribir una variante del programa anterior en la que el comando a ejecutar en vez de ser ls se especifique en la línea de comandos:

1
2
3
$ ./watcher-sol.js 
Usage:
  watcher-sol.js <fileName> [command] [args ... ]
1
2
3
$ ./watcher-sol.js . 'ls' '-l' 
Now watching . for changes...
-rw-r--r--  1 casiano  staff  1460 18 oct 08:37 watcher-fortifying-code.js
1
2
3
$ ./watcher-sol.js . echo "File change"
Now watching . for changes...
File change watcher-fortifying-code.js

El Libro Node.js 8 the Right Way

The JS Event Loop

VScode

El libro EloquentJS. El capítulo 20 es sobre Node.js

El libro Node.js Beyond the Basics

Este es un libro diferente a la mayoría de los libros sobre Node.Js en cuanto que profundiza en el runtime-system de Node.js y por tanto es relevante en la etapa en la que estamos. Sólo están disponibles la introducción y el capítulo de streams. El resto es de pago.

Solución

Comment with GitHub Utterances