¿Cómo operar el método fs.opendir() basado en devolución de llamada con promesas en Node.js?

El método fs.opendir() se define en el módulo Sistema de archivos de Node.js. El módulo del Sistema de Archivos es básicamente para interactuar con el disco duro de la computadora del usuario. El método utilizado para abrir asincrónicamente un directorio.
El método fs.opendir() se basa en la devolución de llamada. El uso de métodos de devolución de llamada genera una gran posibilidad de anidamiento de devolución de llamada o problemas infernales de devolución de llamada. Por lo tanto, para evitarlo, casi siempre nos gusta trabajar con un método basado en promesas. Usando algunos métodos adicionales de node.js, podemos operar un método basado en devolución de llamada de manera prometedora. La promesa se resuelve con el objeto ‘fs.Dir’, el objeto en sí contiene otras funciones para acceder y cerrar el directorio. En caso de que se rechace la promesa, se rechazará con un objeto de error.
Sintaxis: 

fs.opendir(path, options)

Nota: no se requiere devolución de llamada ya que operamos el método con promesas.
Parámetros: acepta dos rutas de parámetros y opciones como se mencionó anteriormente. Las opciones es un parámetro opcional.  

  • ruta: Es un String, Buffer o Url que especifica la ruta al directorio que tiene que estar abierto.
  • opciones: es un parámetro opcional que afecta la salida de alguna manera según se proporcione o no a la llamada de función. 
    • codificación: especifica la técnica de codificación, por defecto es ‘UTF8’
    • bufferSize: es un número que especifica la cantidad de entradas de directorio que se almacenan en el búfer internamente cuando se lee desde el directorio. Un valor alto de bufferSize garantiza un buen rendimiento pero conduce a más usos de memoria.

Devoluciones: si el método opera con promesas, devuelve una promesa resuelta con el objeto ‘fs.Dir’, el objeto en sí contiene otras funciones para acceder y cerrar el directorio. En caso de que se rechace la promesa, se rechazará con un objeto de error.
métodos de objeto ‘dir’: 

  • dir.close(): cierra de forma asíncrona los recursos del directorio y, por lo tanto, el intento posterior de leer dará como resultado errores. Se devuelve una Promesa que se resolverá una vez cerrado el recurso.
  • dir.closeSync() : cierra sincrónicamente los recursos del directorio y, por lo tanto, el intento posterior de leer dará como resultado errores.
  • dir.path : Devuelve la ruta al directorio.
  • dir.read() : lee de forma asíncrona la siguiente entrada del directorio. Una vez completada la lectura, se devuelve una Promesa que se resolverá con un fs.Dirent, o nulo si no hay más directorios leídos.

Enfoque: método fs.opendir() basado en devolución de llamada. Para operarlo con promesas, primero, usamos el método promisify() definido en el módulo de utilidades para convertirlo en un método basado en promesas.
Ejemplo 1: Nombre de archivo: index.js 

javascript

// Importing File System and Utilities module
const fs = require('fs')
const util = require('util')
 
// Convert callback based methods
// to promise based methods
const openDir = util.promisify(fs.opendir)
 
openDir('./testDirectory')
    .then(dir => {
        console.log('Directory is opened')
 
        // Path to the directory
        console.log(`Path to the directory:
                            ${dir.path}`)
 
        // Closing directory
        return dir.close()
    })
 
    .then(() => {
        console.log('Directory closed')
 
        console.log('\nFurther attempt to'
            + ' read sub-directories:\n')
 
        // Further attempt to access the
        // directory results in error
        return dir.read()
    })
 
    .then(dirent => {
 
        // Does not execute since directory
        // is closed catch block runs instead
        console.log(dirent)
    })
    .catch(err => {
        console.log('Error, Something went wrong!')
    })

Implementando la misma funcionalidad usando async-await. 

javascript

// Importing File System and
// Utilities module
const fs = require('fs')
const util = require('util')
 
// Convert callback based methods
// to promise based methods
const openDir = util.promisify(fs.opendir)
 
const fetchDirectory = async (path) => {
 
    // Opeaning directory
    const dir = await openDir(path)
    console.log('Directory is opened')
 
    // Path to the directory
    console.log(`Path to the directory: ${dir.path}`)
 
    // Closing directory
    await dir.close()
    console.log('Directory closed')
 
    console.log('\nFurther attempt to '
        + 'read sub-directories:\n')
     
    // Further attempt to access the directory
    // results in error does not execute since
    // directory is closed catch block runs
    // instead
    const subDir = await dir.read()
    console.log(subDir)
}
 
fetchDirectoey('./testDirectory')
    .catch(err => {
        console.log('Error, Something went wrong!')
    })

Ejecute el archivo index.js con el siguiente comando: 
 

node index.js

Producción: 
 

  Directory is opened
  Path to the directory: testDirectory
  Directory closed

  Further attempt to read sub-directories:

  Error, Something went wrong!

Ejemplo 2: Nombre de archivo index.js 
 

javascript

// Importing File System and Utilities module
const fs = require('fs')
const util = require('util')
 
// Convert callback based methods to
// promise based methods
const openDir = util.promisify(fs.opendir)
 
openDir('./testDirectory')
    .then(dir => {
        console.log('Directory is opened')
 
        // Path to the directory
        console.log(`Path to the directory: ${dir.path}`)
 
        // Reading sub-directories or files
 
        console.log('\nReading sub-directories:\n')
        return dir.read()
    })
 
    .then(dirent => {
        console.log(`Sub-Directory : ${dirent.name}`)
 
        // Reading further sub directories
        return dir.read()
    })
 
    .then(dirent => {
        console.log(`Sub-Directory : ${dirent.name}`)
        return dir.read()
    })
 
    .then(dirent => {
        console.log(`Sub-Directory : ${dirent.name}`)
        return dir.read()
    })
    .then(dirent => {
        console.log(`Sub-Directory : ${dirent.name}`)
        return dir.read()
    })
    .then(dirent => {
        console.log(`Sub-Directory : ${dirent.name}`)
        return dir.read()
    })
    .catch(err => {
        console.log('Error, Something went wrong!')
    })

Implementando la misma funcionalidad usando async-await. 
 

javascript

// Importing File System and Utilities module
const fs = require('fs')
const util = require('util')
 
// Convert callback based methods
// to promise based methods
const openDir = util.promisify(fs.opendir)
 
const fetchDirectory = async (path) => {
 
    // Opeaning directory
    const dir = await openDir(path)
    console.log('Directory is opened')
 
    // Path to the directory
    console.log(`Path to the directory: ${dir.path}`)
 
    // Reading sub-directories or files
    console.log('\nReading sub-directories:\n')
 
    const subDir1 = await dir.read()
    const subDir2 = await dir.read()
    const subDir3 = await dir.read()
    const subDir4 = await dir.read()
    const subDir5 = await dir.read()
 
    // Printing
    console.log(`Sub-Directory : ${subDir1.name}`)
    console.log(`Sub-Directory : ${subDir2.name}`)
    console.log(`Sub-Directory : ${subDir3.name}`)
    console.log(`Sub-Directory : ${subDir4.name}`)
    console.log(`Sub-Directory : ${subDir5.name}`)
}
 
fetchDirectory('./testDirectory')
    .catch(err => {
        console.log('Error, Something went wrong!')
    })

Ejecute el archivo index.js con el siguiente comando: 
 

node index.js

Producción: 
 

  Directory is opened
  Path to the directory: testDirectory

  Reading sub-directories:

  Sub-Directory : testFile1.txt
  Sub-Directory : testFile2.txt
  Sub-Directory : teasrFile3.txt
  Sub-Directory : testFile4.txt
  Sub-Directory : null

Publicación traducida automáticamente

Artículo escrito por hunter__js y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *