【问题标题】:Creating array of JSON objects from file从文件创建 JSON 对象数组
【发布时间】:2019-11-19 10:07:20
【问题描述】:

我有一个 JSOn 文件列表,我想将其读入一个数组,所以每个对象都是 json 文件的内容。

我是 Node 和 Express 的新手,但到目前为止我已经尝试过了。

const express = require('express')
const app = express()
const port = 3001
const fs = require('fs')


//file upload 


const dataFolder = './parsed_json_data' 


let fileNames = []
let fileObjects = []
fs.readdir(dataFolder,(err, files) =>{  
    if(err){
    return console.log(err)
    }   
    fileNames = files.forEach(file =>{
    fileNames.push(file)
    console.log(fileNames)
    });
})

fileNames.forEach(fileName =>{
    fs.readFile(fileName, 'uft8', (err, data) =>{
        if(err){
            console.log(err)
        }
        fileObjects.push(JSON.parse(data))
        console.log(fileObjects)
    })
})




app.get('/', (req, res) => res.send('Hello World!'))

app.listen(port, () => console.log(`Example app listening on port ${port}!`))

问题是它是异步操作吗?如果是这种情况,我该如何让它等待,以便在映射之前读取文件名?

我尝试过使用 async/await,但没有成功,因为它是单独的操作?

【问题讨论】:

标签: javascript node.js express io


【解决方案1】:

我认为代码会在文件系统调用完成之前遍历 fileNames 数组。您可以尝试将创建文件名的代码放在它自己的函数中,该函数返回数组的承诺。请看下面的代码:

function getDirFiles(dataFolder) {
  return new Promise((resolve, reject) => {
    let fileNames = [];
    fs.readdir(dataFolder, async (err, files) => {
      if (err) {
        console.log(err);
        reject(err);
      } else {

        files.forEach(file => {
          fileNames.push(file);
          console.log(fileNames);
        });

        resolve(fileNames);

      }
    });
  });
}

getDirFiles(dataFolder).then(fileNames => {
   console.log(fileNames);
});

【讨论】:

  • SyntaxError: await is only valid in async function
  • 您可以将等待函数调用的位置放在异步函数中,也可以在调用之后放置 then 以获取文件。我会用第二种方式更新答案。
【解决方案2】:

您可以在 forEach 中使用要映射的数组。计算数组的总长度并在到达最后一个 fakeItem 时触发该函数。

const fakeItems = [...document.querySelectorAll('.items)]
fakeitems.forEach((fakeItem, i, arr) => {
   const arrLength = arr.length - 1
   if (i === arrLength) {
       secondFunction()
    }
})
function secondFunction() {
 /* This function fires once the last item is mapped though */
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 2021-12-24
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多