我正在尝试获取文件的名称和创建日期。在下面的代码中,当我调用 api 时,它会抛出错误。它正在读取目录并打印所有文件名,但不会发送回回调。知道实现的错误是什么吗?
service.js
var fs = require('fs');
var path = require('path');
var async = require('async');
var currentDate = new Date();
var objToReturn = [];
var logsDirectory = './logs'
function readDirectory(env, callback) {
fs.readdir(logsDirectory + '/' + env, function(err, files) {
// loop through each file
async.eachSeries(files, function(file, done) {
var dirPath = logsDirectory + '/' + env;
var filePath = path.join(dirPath, file);
var fileInfo = {};
fs.stat(filePath, function(err, stats) {
if (err) {
console.info("File doesn't exist");
} else {
fileInfo.fileDate = stats.birthtime;
fileInfo.filename = file;
objToReturn.push(fileInfo);
done();
}
});
});
},
function(err) {
if (err) {
console.info('error', err);
return;
}
// when you're done reading all the files, do something...
console.log('before Callback', objToReturn);
callback(objToReturn);
});
}
exports.readDirectory = readDirectory;
app.js
var stDirectory = require('./app/serverfiles/stDir');
app.get('/getAllFiles',function(req,res){
var env = req.query.env
console.log('printing',env);
stDirectory.readDirectory(env,function(files){
res.json(files);
console.log('Api files',files);
});
});
最佳答案
有几个问题:
- 您不是将“最终”处理程序传递给
async.eachSeries()
,而是将其传递给fs.readdir()
,因此回调
永远不会被调用; - 您在函数外部声明
objToReturn
,这不是一个好主意,因为可以并行处理多个请求; - 您没有正确处理任何错误;
- 您确实应该使用 Node.js 回调习惯用法,即使用两个参数调用回调,第一个是错误(如果有),第二个是异步操作的结果。
下面的代码应该可以解决这些问题:
function readDirectory(env, callback) {
let objToReturn = [];
fs.readdir(
logsDirectory + "/" + env,
function(err, files) {
if (err) return callback(err);
// loop through each file
async.eachSeries(files, function(file, done) {
var dirPath = logsDirectory + "/" + env;
var filePath = path.join(dirPath, file);
var fileInfo = {};
fs.stat(filePath, function(err, stats) {
if (err) {
console.info("File doesn't exist");
return done(err);
} else {
fileInfo.fileDate = stats.birthtime;
fileInfo.filename = file;
objToReturn.push(fileInfo);
done();
}
});
}, function(err) {
if (err) {
console.info("error", err);
return callback(err);
}
// when you're done reading all the files, do something...
console.log("before Callback", objToReturn);
callback(null, objToReturn);
}
);
}
// To call it:
stDirectory.readDirectory(env, function(err, files) {
if (err) {
res.sendStatus(500);
} else {
res.json(files);
console.log('Api files',files);
}
});
您还应该考虑使用 async.mapSeries()
而不是 async.eachSeries()
并使用单独的数组 (objToReturn
)。
关于javascript - 从目录读取文件时出现错误,发送后无法获取 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43054279/