javascript example - Usando el sistema de archivos en node.js con async / await



function only (5)

Me gustaría usar async / await con algunas operaciones del sistema de archivos. Normalmente async / await funciona bien porque uso las babel-plugin-syntax-async-functions .

Pero con este código me encuentro con el caso if donde los names no están definidos:

import fs from 'fs';

async function myF() {
  let names;
  try {
    names = await fs.readdir('path/to/dir');
  } catch (e) {
    console.log('e', e);
  }
  if (names === undefined) {
    console.log('undefined');
  } else {
    console.log('First Name', names[0]);
  }
}

myF();

Cuando reconstruyo el código en la versión infernal de devolución de llamada, todo está bien y obtengo los nombres de archivo. Gracias por tus sugerencias.


Answers

Comenzando con el nodo 8.0.0, puedes usar esto:

import fs from 'fs';
import {promisify} from 'util';

const readdir = promisify(fs.readdir);

async function myF() {
  let names;
  try {
    {err, names} = await readdir('path/to/dir');
    if (err) {
        // Handle the error.
    }
  } catch (e) {
    console.log('e', e);
  }
  if (names === undefined) {
    console.log('undefined');
  } else {
    console.log('First Name', names[0]);
  }
}

myF();

Consulte https://nodejs.org/dist/latest-v8.x/docs/api/util.html#util_util_promisify_original


Es posible que produzca el comportamiento incorrecto porque File-Api fs.readdir no devuelve una promesa. Sólo se necesita una devolución de llamada. Si desea ir con la sintaxis de async-await, podría "promisificar" la función de esta manera:

function readdirAsync(path) {
  return new Promise(function (resolve, reject) {
    fs.readdir(path, function (error, result) {
      if (error) {
        reject(error);
      } else {
        resolve(result);
      }
    });
  });
}

y llámalo en su lugar:

names = await readdirAsync('path/to/dir');

Esto es lo que funcionó para mí:

const fsp = require('fs-promise');

(async () => {
  try {
    const names = await fsp.readdir('path/to/dir');
    console.log(names[0]);
  } catch (e) {
    console.log('error: ', e);
  }
})();

Este código funciona en el nodo 7.6 sin babel cuando la bandera de armonía está habilitada: node --harmony my-script.js . Y comenzando con el nodo 7.7, ¡ni siquiera necesitas esta bandera !

La biblioteca fsp incluida al principio es solo una envoltura promisificada para fs (y fs-ext ).

¡Estoy realmente entusiasmado con lo que puedes hacer en nodo sin babel en estos días! Native async / await hace que escribir código sea un placer!

ACTUALIZACIÓN 2017-06: el módulo fs-promise fue desaprobado. Utilice fs-extra lugar con la misma API.


Node.js 8.0.0

Async nativo / await

const fs = require('fs')

const readFile = (path, opts = 'utf8') =>
    new Promise((res, rej) => {
        fs.readFile(path, opts, (err, data) => {
            if (err) rej(err)
            else res(data)
        })
    })

const writeFile = (path, data, opts = 'utf8') =>
    new Promise((res, rej) => {
        fs.writeFile(path, data, opts, (err) => {
            if (err) rej(err)
            else res()
        })
    })

module.exports = {
    readFile,
    writeFile
}

Uso

Siempre use try..catch para esperar bloques, si no desea volver a lanzar la excepción superior.

// in some module, with imported function 
// in async block    
const res = await readFile('data.json')
console.log(res)

Al usar Node.js , puede recuperar variables de entorno por clave desde el objeto process.env :

por ejemplo

var mode   = process.env.NODE_ENV;
var apiKey = process.env.apiKey; // '42348901293989849243'

Aquí está la respuesta que explicará la configuración de las variables de entorno en node.js





javascript node.js async-await fs