112

これが可能かどうかはわかりませんが、ここに行きます。また、コールバックを使用すると、さらに困難になります。

node.jsとsocket.ioを使用してオブジェクトチャンクでクライアントに送り返したいhtmlファイルを含むディレクトリがあります。

すべてのファイルは /tmpl にあります

したがって、ソケットは /tmpl 内のすべてのファイルを読み取る必要があります。

ファイルごとに、ファイル名をキー、コンテンツを値としてオブジェクトにデータを格納する必要があります。

  var data;
  // this is wrong because it has to loop trough all files.
  fs.readFile(__dirname + '/tmpl/filename.html', 'utf8', function(err, html){
      if(err) throw err;
      //filename must be without .html at the end
      data['filename'] = html;
  });
  socket.emit('init', {data: data});

最後のコールバックも間違っています。ディレクトリ内のすべてのファイルが完了したときに呼び出す必要があります。

しかし、コードの作成方法がわかりません。これが可能かどうか知っている人はいますか?

4

11 に答える 11

198

したがって、3 つの部分があります。読み取り、保存、および送信。

読み上げ部分は次のとおりです。

var fs = require('fs');

function readFiles(dirname, onFileContent, onError) {
  fs.readdir(dirname, function(err, filenames) {
    if (err) {
      onError(err);
      return;
    }
    filenames.forEach(function(filename) {
      fs.readFile(dirname + filename, 'utf-8', function(err, content) {
        if (err) {
          onError(err);
          return;
        }
        onFileContent(filename, content);
      });
    });
  });
}

格納部分は次のとおりです。

var data = {};
readFiles('dirname/', function(filename, content) {
  data[filename] = content;
}, function(err) {
  throw err;
});

送信部分はあなた次第です。1 つずつ送信するか、読み終わってから送信することをお勧めします。

読み取り完了後にファイルを送信する場合は、同期バージョンのfs関数を使用するか、promise を使用する必要があります。非同期コールバックは適切なスタイルではありません。

さらに、拡張機能の削除について質問しました。質問は 1 つずつ進めてください。あなたのためだけに完全な解決策を書く人はいません。

于 2012-04-06T21:57:09.760 に答える
1

コードがさまざまな環境でスムーズに動作するようにするには、パスが操作される場所でpath.resolveを使用できます。これは、より適切に機能するコードです。

読み部分:

var fs = require('fs');

function readFiles(dirname, onFileContent, onError) {
  fs.readdir(dirname, function(err, filenames) {
    if (err) {
      onError(err);
      return;
    }
    filenames.forEach(function(filename) {
      fs.readFile(path.resolve(dirname, filename), 'utf-8', function(err, content) {
        if (err) {
          onError(err);
          return;
        }
        onFileContent(filename, content);
      });
    });
  });
}

収納部:

var data = {};
readFiles(path.resolve(__dirname, 'dirname/'), function(filename, content) {
  data[filename] = content;
}, function(error) {
  throw err;
});
于 2016-08-24T21:53:35.707 に答える