【问题标题】:readFileSync returns undefined when trying to read data from files尝试从文件中读取数据时,readFileSync 返回 undefined
【发布时间】:2020-05-12 02:16:18
【问题描述】:

我在名为data 的目录下创建了多个函数,并用名为generatedRandomData 的函数返回的一些随机数据填充它们。 为了创建多个文件,我编写了以下函数:

const createFile = (fileName, data) => {
  if (fs.existsSync(fileName)) throw new Error('Filename already exists');
  fs.writeFile(fileName, data, {
    encoding: 'utf8',
    flag: 'w',
  }, (error) => {
    if (error) return error;
    console.log('File created successfully');
    return null;
  });
};

const createFiles = (dirPath, sizeList) => {
  if (sizeList && !sizeList.length) throw new Error('The list of size should not be empty');

  const fileCreationPromises = sizeList.map(async (size) => {
    const data = generateRandomData(size);
    const fileName = resolve(dirPath, `./data_${size}.txt`);
    await createFile(fileName, data);
  });
  return Promise.all(fileCreationPromises);
};

然后我调用函数generateData以生成随机数据并调用上述函数然后创建文件:

const generateData = async (dirPath, sizeList) => {
  if (!dirPath) throw new Error('No directory path was provied');
  if (!sizeList || (sizeList && !sizeList.length)) throw new Error('Size list should not be empty');
  await createFiles(dirPath, sizeList);
};

我调用另一个名为execute 的函数从这些文件中读取数据以继续处理:

const execute = async (func, dirPath, label) => {
  const files = fs.readdirSync(dirPath);
  const result = [];
  if (files && files.length) {
    for (const file of files) {
      const filename = resolve(dirPath, `./${file}`);
      const parsedData = readDataFromFile(filename);
      const data = parsedData.split(',').map((d) => Number(d));
      const { length } = data;

      result.push({
        label: length,
        value: getExecutionTime(func, data),
      });
    }
  }
  await createFile(resolve(dirPath, `./${label}`), result);
};

最后,我调用了函数initialize

const { resolve } = require('path');
const fs = require('fs');
const { generateData, sizeList, execute } = require('../utils/helpers');
const { underscorePartial } = require('../main/partial');

const dirPath = resolve(__dirname, '../data');

const initialize = () => {
  if (!fs.existsSync(dirPath)) {
    fs.mkdir(dirPath, async (error) => {
      if (error) throw error;
      await generateData(dirPath, sizeList);
      await execute(underscorePartial, dirPath, 'uExecutionTime.txt');
    });
  }
};

try {
  initialize();
} catch (error) {
  console.log(error);
}

但是我意识到要在最后一步创建的uExecutionTime.txt 包含undefined,因为函数readDataFromFile 返回undefined。 我猜readDataFromFile 在数据创建完成之前就开始从文件中读取。有什么建议可以修复我的代码,或者代码中有什么遗漏或错误吗?

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    问题在于您的createFile 函数。当它不返回承诺时,你关心等待它。这是一种回调样式。它应该包含在 promise 中。

    const createFile = (fileName, data) => {
      if (fs.existsSync(fileName)) throw new Error('Filename already exists');
      return new Promise((resolve, reject) => {
        fs.writeFile(fileName, data, {
        encoding: 'utf8',
        flag: 'w',
      }, (error) => {
        if (error) reject(error);
        console.log('File created successfully');
        resolve(null);
        });
      });
    };
    

    希望这能解决问题。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-18
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多