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
,请查看此答案。