从目录中读取文件后发送错误无法获取标头?

时间:2017-03-27 18:52:46

标签: javascript node.js fs

我正在尝试获取文件的名称和创建日期。在下面的代码中,当我调用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);
    });
});

1 个答案:

答案 0 :(得分:1)

有一些问题:

  • 而不是通过" final" async.eachSeries()的处理程序,您将其传递给fs.readdir(),因此永远不会调用callback;
  • 您在函数外部声明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)。