错误:仅当异步功能中已有功能时,等待才在异步功能中有效

时间:2020-03-27 00:10:14

标签: node.js asynchronous sha256

目标:从我的目录中获取文件列表;为每个文件获取SHA256

错误:await is only valid in async function

我不确定为什么会这样,因为我的函数已经包装在异步函数中了。

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 个答案:

答案 0 :(得分:1)

您的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模块的promises接口。
  2. 使用await fsp.readdir()使用promises读取文件
  3. 使用for/of循环,以便我们可以正确地对await进行异步操作。
  4. 调用该函数并监视完成和错误。