Ошибка: ожидание действительно только в функции asyn c, когда функция уже находится в функции asyn c - PullRequest
0 голосов
/ 27 марта 2020

Цель: получить список файлов из моего каталога; получить SHA256 для каждого из этих файлов

Ошибка: await is only valid in async function

Я не уверен, почему это так, поскольку моя функция уже заключена в асин * c функцию .. любая помощь приветствуется!

const hasha = require('hasha');

const getFiles = () => {
    fs.readdir('PATH_TO_FILE', (err, files) => {
        files.forEach(i => {
           return i;
        });
    });   
}
(async () => {
    const getAllFiles = getFiles()
    getAllFiles.forEach( i => {
        const hash = await hasha.fromFile(i, {algorithm: 'sha256'});
        return console.log(hash);
    })
});

1 Ответ

1 голос
/ 27 марта 2020

Ваш await не находится внутри функции async, потому что он находится внутри обратного вызова .forEach(), который не объявлен async.

Вам действительно нужно переосмыслить подход к этому, потому что getFiles() даже ничего не возвращает. Имейте в виду, что возврат из обратного вызова просто возвращает этот обратный вызов, а не из родительской функции.

Вот что я бы предложил:

const fsp = require('fs').promises;
const hasha = require('hasha');

async function getAllFiles() {
    let files = await fsp.readdir('PATH_TO_FILE');
    for (let file of files) {
        const hash = await hasha.fromFile(i, {algorithm: 'sha256'});
        console.log(hash);            
    }
}

getAllFiles().then(() => {
    console.log("all done");
}).catch(err => {
    console.log(err);
});

В этой новой реализации:

  1. Используйте const fsp = require('fs').promises для получения интерфейса обещаний для модуля fs.
  2. Используйте await fsp.readdir() для чтения файлов с использованием обещаний
  3. Использование for/of l oop, чтобы мы могли надлежащим образом упорядочить наши асинхронные операции с await.
  4. Вызовом функции и отслеживанием как завершения, так и ошибки.
...