代码之家  ›  专栏  ›  技术社区  ›  Ben Beri

NodeJS读取多个文件阻塞并返回express响应

  •  0
  • Ben Beri  · 技术社区  · 6 年前

    我正在检索一个路由,然后从一个目录中获取所需的所有json文件。

    我需要按键值将所有这些json文件合并到一个json对象中,其中键是文件名,值是文件内容。

    我需要使其异步,因为如果不是,响应将在文件系统完成其工作之前发送,并且我将有一个空的json对象响应。

    我试着用 Promise.all 具有 await :

      app.route("/pull").get(async function(req, res) {
          fs.readdir(path, async (error, files) => {      
            if (error) {
              console.log("Could not load files. ", error.message);
              res.sendStatus(500);
            }
            else {
    
              let json = {};
    
              json = await Promise.all(
                  files.map(async (fileName, index) => {
    
                    return await fs.readFile(path + fileName, 'utf-8', (err, content) => {
    
                        return {key: fileName, value : JSON.parse(content)}
    
                    });
    
                  })
    
              );
    
              res.status(200).json(json);
            }
        });
      });
    

    [null] 作为回应,我错过了什么?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Christian    6 年前

    路由处理程序不等待 fs.readdir 完成回调。你需要承诺 readdir 就像这样:

    import fs from 'fs';
    import {promisify} from 'util';
    const readdir = promisify(fs.readdir);
    

    然后在处理程序中:

    {error, files} = await readdir(...)
    ...
    
    推荐文章