Nodo: compruebe si el archivo o el directorio están vacíos

En esta guía, veremos cómo verificar si un archivo o directorio está vacío o no en Node.js, tanto cuando se proporciona desde un formulario como para el trabajo de back-end.

Introducción

Las aplicaciones web suelen recibir la entrada del usuario en alguna forma, y con cualquier entrada, la validación es importante. Asegurarse de que los campos de formulario contengan datos válidos, o que contengan algún dato, es una de las primeras comprobaciones que puede hacer.

Cuando un usuario carga archivos, querrá verificar si estos archivos están vacíos, no solo si existen o no. Además, dado que Node admite el desarrollo del lado del servidor y puede trabajar con el sistema de archivos, se encontrará trabajando con archivos y directorios todo el tiempo, especialmente si está creando una aplicación CLI.

En esta guía, veremos cómo verificar si un archivo o directorio está vacío, usando Node.js.

Nota: Esta tarea se puede observar a través de dos lentes: recibir un archivo desde el front-end y validarlo, o trabajar con el sistema de archivos independientemente de un front-end potencialmente inexistente. Echaremos un vistazo a ambos.

Comprobar si un archivo está seleccionado con JavaScript

Vanilla JavaScript no está preparado para la tarea de comprobar si un archivo está vacío o no, ya que puede comprobar si un formulario tiene un archivo adjunto, pero no puede procesar el archivo en sí.

Comenzaremos desde allí, verificando si el archivo se selecciona del sistema de archivos y se adjunta al formulario. Vamos a crear un formulario simple en el front-end

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<!DOCTYPE html>
<html lang="en">
<head>
    <!-- Meta tags -->
</head>
<body>
    <form enctype="multipart/form-data">
        <input type="file" name="file" id="file">
        <button type="submit" onclick="checkFile()">Submit</button>    
    </form>
        
    <script src="script.js"></script>
</body>
</html>

La página contiene un <formulario> que acepta un archivo multiparte, a través de un <input type="file">. Una vez que se presiona el botón, se activa la función checkFile(), desde el script.js importado:

1
2
3
4
5
6
function checkFile() {
    let fileInputField = document.getElementById("file");
    if (fileInputField.files.length == 0) {
        alert("Please select a file!")
    }
}

Obtenemos nuestro elemento input con document.getElementById() y verificamos la longitud de la propiedad files, que tiene una input de tipo file. Si está vacío, alertamos al usuario de que no se ha seleccionado ningún archivo.

Una vez que estemos seguros de que el usuario ha proporcionado un archivo, podemos comprobar si ha proporcionado un archivo no vacío.

El módulo fs

Nodo.js es un entorno de tiempo de ejecución de JavaScript que ejecuta código JavaScript fuera del navegador. Esto nos brinda la capacidad de interactuar con el sistema operativo subyacente y el sistema de archivos también. El módulo integrado fs (Sistema de archivos) funciona de maravilla para nosotros en este caso.

Confiaremos en los métodos fs.readFile() y fs.readdir().

Comprobar si un archivo está vacío con Node.js

Una vez que el usuario envía un archivo a través de un formulario a su back-end, por ejemplo, al punto final /upload, es hora de verificar si el archivo está vacío.

La forma más fácil de verificar es transmitir los datos dentro del archivo y verificar su longitud. Si hay 0 bytes en el archivo, o mejor dicho, si la longitud de los datos es igual a 0, el archivo está vacío:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
router.post('/upload', function(req, res) {
    const fs = require('fs');
    const multiparty = require('multiparty');
    let form = new multiparty.Form();
    form.parse(req, function(err, fields, files) {
        let file = files.keySelect[0];
        fs.readFile(file, function(err, data) {
            if (data.length == 0) {
                return res.status(422).json({message : "File is empty! Unprocessable Entity."});
            }
        })
    });
    return res.status(200).json({message: "Success"});
});

Hemos utilizado el módulo multipartidario para obtener el archivo del formulario, aunque este paso también se puede realizar con otras bibliotecas, como Multar o Formidable .

Con multiparty, podemos crear una instancia de un formulario y analizarlo, pasándole el req, que es nuestro formData enviado desde el front-end. El método keySelect() devuelve todos los archivos enviados a través del formulario, pero dado que nuestro formulario solo acepta uno y solo esperamos uno, accedemos a él a través de [0]. Usando el método fs.readFile(), estamos leyendo el archivo y desempaquetando sus datos. Si estos datos tienen una longitud de 0, el archivo está vacío y devolvemos un código de estado 422 Entidad no procesable.

Si no está tratando con un archivo proporcionado por un formulario y ya tiene el nombre en mente, puede omitir este proceso por completo y leer el archivo directamente:

1
2
3
4
5
6
7
fs.readFile("myFile.txt", function(err, data) {
    if (data.length == 0) {
        console.log("File is empty!");
    } else {
        console.log("File is not empty!");
    }
})

Comprobar si un directorio está vacío con Node.js

Al verificar si un directorio está vacío, podemos usar el método readDir():

1
2
3
4
5
6
7
fs.readdir(directoryName, function(err, data) {
    if (data.length == 0) {
        console.log("Directory is empty!");
    } else {
        console.log("Directory is not empty!");
    }
})

Estos dos métodos son completamente equivalentes en sintaxis (excepto por el nombre del método), por lo que todo lo que se aplica a uno se aplica al otro. Si los datos del directorio son iguales a 0, está vacío.

This is typically coupled with enumerar archivos en un directorio.

Conclusión

Trabajar con archivos es un lugar común para los proyectos de Node, ya que está destinado a ser utilizado en el lado del servidor. Una de las comprobaciones básicas que puede realizar para validar archivos es verificar si están vacíos o no.

En esta guía, hemos analizado cómo verificar si un archivo o directorio está vacío con Node.js.