fs.readdir()を使用してファイルを返すことはできません。ファイルの読み取りが完了したときにコールバックを非同期に実行するだけなのでです。次に、ファイルオブジェクト自体がパラメータとしてコールバックに渡されます。
あなたがREADDIRの結果を返したい場合は、次の2つのオプションがあります。
1)synchronous version of readdirを使用します。これはそのまでノードつのスレッドをあなたが望むように、しかし、ファイルシステムを返すてブロックしますが完了し、これがプログラム上で絶対に望ましくない動作を引き起こす可能性があり、fi Webアプリケーションで深刻な問題になる可能性があります(すべてのクライアントからのすべての要求は、readdirsyncが完了するまでブロックされます)。
2)Promiseを使用してください。プロミスは実際には同期コードのような値を返すわけではありませんが、同期のように非同期コードのフローを制御することができますletting you to throw exceptions and chain return values in your code。
Fiが、ブルーバード実装(which requires to install the bluebird package)を使用して、約束の使用例:今すぐ
var fs = require('fs');
var Promise = require('bluebird');
var dir = '/../../';
var ext = 'yml';
var readdirAsync = Promise.promisify(fs.readdir);
//var c = new Array(); You dont need c as a global now, since you can return the result of the function from inside the iterateOverDir function.
/*Now this function returns a Promise that will pass the readdir value when the promise is fullfilled*/
var test1 = function() {
/*yeah a single line function is pretty redundant but is to keep consistence with the OP code*/
return fs.readdirAsync(dir);
}
/*
and this function just iterates over list performing some actions and
returning a 'result' array. When this whole function is passed as a parameter in a .then(), it takes whatever the function inside the previous then/promise returns, and pass its return value to the next. This is true whenever the previous promise/then is synchronous or asynchronous code.
*/
var iterateOverDir = function(list){
var re = new RegExp("^.*\." + ext + "$");
list.forEach(function(item) {
var result = new Array();
if(re.test(item)) {
result.push(item);
}
return result;
}
test1.then(iterateOverDir).catch(console.log)
then(console.log /* or whatever function that uses the previous function return value.*/);
、約束のおかげで、あなたはiterateOverDir(へのパイプをすることができます)、プレーンからすべての値平野同期コード - ある-which同期コードまたは非同期です。しかし、コードを.then()。then()...チェーンの中に入れておく必要があります。
配列を返す場合は、readdirのsynchronusバージョンを探している可能性があります。https://nodejs.org/api/fs.html#fs_fs_readdirsync_path_options –
なぜreaddir内からアイテムを返すのですか?それはどこにでもつかまえられない。 – Jay