Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 尝试从文件读取数据时,readFileSync返回undefined_Javascript_Node.js - Fatal编程技术网

Javascript 尝试从文件读取数据时,readFileSync返回undefined

Javascript 尝试从文件读取数据时,readFileSync返回undefined,javascript,node.js,Javascript,Node.js,我在名为data的目录下创建了多个函数,并用名为generatedRandomData的函数返回的一些随机数据填充它们。 要创建多个文件,我编写了以下函数: const createFile = (fileName, data) => { if (fs.existsSync(fileName)) throw new Error('Filename already exists'); fs.writeFile(fileName, data, { encoding: 'utf8

我在名为
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
在数据创建完成之前就开始从文件中读取数据。是否有任何修复代码的建议,或者代码中是否有任何遗漏或错误?

问题在于
createFile
函数。你在乎等待它,而它不会回报你的承诺。这是一种回调风格。它应该用承诺来包装

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);
    });
  });
};

希望这能解决问题。

问题在于您的
createFile
函数。你在乎等待它,而它不会回报你的承诺。这是一种回调风格。它应该用承诺来包装

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);
    });
  });
};

希望这能解决问题。

同意,需要推荐createFile函数@如果您想使用async/await而不是
newpromise
,请查看此答案。同意,需要推荐createFile函数@如果您想使用async/await而不是
newpromise
,请查看此答案。