2017-03-27 1 views
0

私はファイルの名前と作成日を取得しようとしています。下のコードでは、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

いくつかの問題があります。

  • ではなくasync.eachSeries()に "最終" ハンドラを渡すので、あなたがしていますfs.readdir()に渡すので、callbackは決して呼び出されません。
  • あなたはobjToReturnの外に関数のを宣言しています。これは、複数の要求を並列に処理できるため、お勧めできません。
  • エラーは正しく処理されていません。
  • 2つの引数を持つコールバックコールのNode.jsコールバックのイディオムを使用してください。最初のものはエラー(存在する場合)で、2番目のものは非同期操作の結果です。

次のコードは、これらの問題を修正する必要があります。

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)を使用して検討すべきです。

+0

これはうまくいきました...私は変更を加える意味を説明していただきありがとうございます – hussain

関連する問題