Javascript NodeJs存储目录中所有文件的内容
我有以下功能:Javascript NodeJs存储目录中所有文件的内容,javascript,node.js,file,file-read,Javascript,Node.js,File,File Read,我有以下功能: readFiles: function(partidosPath) { fs.readdir(partidosPath,function(err,files){ if (err) throw err; files.forEach(function(file){ if(file) { fs.readFile(partidosPath+file, 'utf8', function (err,data) {
readFiles: function(partidosPath) {
fs.readdir(partidosPath,function(err,files){
if (err) throw err;
files.forEach(function(file){
if(file) {
fs.readFile(partidosPath+file, 'utf8', function (err,data) {
var details = [];
if (err) {
return console.log(err);
}
commonFunctions.arrayLoader(details, {name: file, content: data});
console.log(details);
return details;
});
}
});
});
}
从目录中的文件列表中读取内容的
我需要用每个文件的名称和内容保存一个对象数组,如下所示:
array = [{name: file1Name, content: file1Content},....]
var details = partidos.readFiles(partidosPath);
console.log(details);
我在另一个文件中调用该函数,如下所示:
array = [{name: file1Name, content: file1Content},....]
var details = partidos.readFiles(partidosPath);
console.log(details);
问题是,在readFiles
方法的console.log(details)
中,我可以正确地看到信息,但是当我调用该方法时,console.log
返回未定义的信息
PD:如果我在声明位置之外声明了readFiles
的details[]
,则信息不会正确地推送到数组中
我缺少什么?问题是您正在进行异步调用。在异步调用中,您的程序将在调用后继续运行,而不是等待函数完成,因此它们将继续运行
console.log(details).
您或者需要做出承诺并让它等待调用完成,或者使用此处提供的调用的同步版本。与下面的链接
fs.readdirSync(path[, options])
fs.readFileSync(path[, options])
问题是您正在进行异步调用。在异步调用中,您的程序将在调用后继续运行,而不是等待函数完成,因此它们将继续运行
console.log(details).
您或者需要做出承诺并让它等待调用完成,或者使用此处提供的调用的同步版本。与下面的链接
fs.readdirSync(path[, options])
fs.readFileSync(path[, options])
您在“partidos.readFiles(partidosPath)”中已经有了“console.log”语句。数据读取完成后,它将自动记录数据。您不需要另一个console.log来执行此操作 以下是工作代码:
// utils.js
const fs = require('fs')
const readFiles = function (path, callback) {
let arrayOfFileObjects = [];
fs.readdir(path, function (err, fileNames) {
if (err) {
console.log('Read dir error!')
return;
}
if (fileNames.length <= 0) {
console.log('No files exist in the mentioned directory!')
return
}
for (let i = 0; i < fileNames.length; i++) {
const fileName = fileNames[i];
fs.readFile(`${__dirname}\\${fileName}`, 'utf-8', function (err, fileContent) {
if (err) {
console.log(err)
console.log('Error occured while attempting to read: ' + fileName)
return;
}
arrayOfFileObjects.push({
name: fileName,
content: fileContent
})
if (i === fileNames.length - 1) {
callback(arrayOfFileObjects);
}
})
}
})
}
module.exports = {
readFiles
}
“partidos.readFiles(partidosPath)”中已经有了“console.log”语句。数据读取完成后,它将自动记录数据。您不需要另一个console.log来执行此操作 以下是工作代码:
// utils.js
const fs = require('fs')
const readFiles = function (path, callback) {
let arrayOfFileObjects = [];
fs.readdir(path, function (err, fileNames) {
if (err) {
console.log('Read dir error!')
return;
}
if (fileNames.length <= 0) {
console.log('No files exist in the mentioned directory!')
return
}
for (let i = 0; i < fileNames.length; i++) {
const fileName = fileNames[i];
fs.readFile(`${__dirname}\\${fileName}`, 'utf-8', function (err, fileContent) {
if (err) {
console.log(err)
console.log('Error occured while attempting to read: ' + fileName)
return;
}
arrayOfFileObjects.push({
name: fileName,
content: fileContent
})
if (i === fileNames.length - 1) {
callback(arrayOfFileObjects);
}
})
}
})
}
module.exports = {
readFiles
}
我怎么能保证呢?有什么想法吗?声明函数async并将fs.readdir作为返回的承诺。之后,您需要在fs.readFile上使用'await'。然后更改退货明细;解决(细节);之后,我将在var details=await partidos.readFiles(partidosPath)上再次使用wait;我在下面留下了两个链接以提供帮助,请让我知道这是否有帮助@pedrodotnet有帮助吗?很抱歉耽搁了,我改变了方法,我将匹配项存储在数据库的一个表中,我不再需要从目录中读取文件。我怎样才能保证这一点?有什么想法吗?声明函数async并将fs.readdir作为返回的承诺。之后,您需要在fs.readFile上使用'await'。然后更改退货明细;解决(细节);之后,我将在var details=await partidos.readFiles(partidosPath)上再次使用wait;我在下面留下了两个链接以提供帮助,请让我知道这是否有帮助@pedrodotnet有帮助吗?很抱歉耽搁了,我改变了方法,我将匹配项存储在数据库的一个表中,我不再需要从目录中读取文件。我知道,我只是放控制台日志来检查功能,问题是数据没有保存,函数返回未定义我知道,我只是放了控制台日志来检查功能,问题是数据没有保存,函数的返回返回未定义