1

そこで、ブログをやり直してマークダウンを使用することにしました。ブログというフォルダーに3つのマークダウンファイルがあり、日付順にリストしたいと思っていました。問題は、アレイを台無しにするために何をしたのかわからないことです。

これが私のroutes.jsファイルです

exports.list = function(req, res){
  var walk = require('walk'), fs = require('fs'), options, walker;
  var walker = walk.walk('blog');
  var fs = new Array();
  walker.on("file", function(root,file,next){
    var f = root + "/" + file['name'].substring(0, file['name'].lastIndexOf('.'));
    // push without /blog prefix
    if (file['name'].substr(-2) == "md") {
        fs.push(f.substring(f.indexOf('/')));
        console.log(fs);

    }
    next();
  });
  walker.on("end", function() {
      var model = {
            layout:'home.hbs',
            title: 'Entries',
            files: fs
        };
    res.render('home.hbs', model)
  });
};

しかし、私がターミナルに返すのはこれです:

[ '/first' ]
[ '/first', '/second' ]
[ '/first', '/second', '/third' ]

最初の2つを表示して、次のようにマークダウンファイルで日付順に並べ替えたいとしましょう。

Title:  Lorem Ipsum dolor sit amet
Date:   January 2d, 2012

# test message

私の配列/残りのコードの何が問題になっていますか

4

1 に答える 1

3

私が最初に気付いたのは、fs変数の再宣言です。2行目ではノードのファイルシステムモジュールであり、4行目では(私に言わせればそうnew Array()あるはずです)です。[]

walkerまた、モジュールの目的もわかりません。githubリポジトリが削除され、npmパッケージが古くなっているため、ファイルを一覧表示するにはrawファイルシステムモジュールAPIを使用することをお勧めします。おそらく、ファイルの場所を処理するためのパスモジュールと、ファイルを接着するための非同期を使用することをお勧めします。一緒:

// `npm install async` first.
// https://github.com/caolan/async
var fs    = require('fs');
var async = require('async');

// Lists directory entries in @dir,
// filters those which names ends with @extension.
// calls callback with (err, array of strings).
//
// FIXME:
// Mathes directories - solution is fs.stat()
// (could also sort here by mtime).
function listFiles(dir, extension, callback) {
  fs.readdir(dir, function(err, files) {
    if (err) {
      console.error('Failed to list files in `%s`: %s', dir, err);
      return callback(err);
    }

    var slicePos = -extension.length;
    callback(null, files.filter(function(filename) {
      return (extension == filename.slice(slicePos))
    }));
  });
}

// Sorts markdown based on date entry.
// Should be based on `mtime`, I think,
// since reading whole file isn't great idea.
// (See fs.Stats.)
// At lease add caching or something, you'll figure :)
//
// Also, you better get yourself a nice markdown parser,
// but for brevity I assume that first 2 lines are:
// Title:  Some Title
// Date:   Valid Javascript Datestring
function sortMarkdown(pathes, callback) {
  async.sortBy(pathes, function(fileName, cb) {
    // Following line is dirty!
    // You should probably pass absolute pathes here
    // to avoid errors. Path and Fs modules are your friends.
    var md = __dirname + '/blogs/' + fileName;

    fs.readFile(md, 'utf8', function(err, markdown) {
      if (err) {
        console.error('Failed to read `%s`: %s', md, err);
        return cb(err);
      }

      // Get second line of md.
      var date = markdown.split('\n')[1];

      // Get datestring with whitespaces removed.
      date = date.split(':')[1].trim();

      // Get timestamp. Change with -ts
      // to reverse sorting order.
      var ts = Date.parse(date);

      // Tell async how to sort; for details, see:
      // https://github.com/caolan/async#sortBy
      cb(null, ts);
    });
  }, callback);
}

function listSortedMarkdown(dir, callback) {
  // Async is just great!
  // https://github.com/caolan/async#waterfall
  async.waterfall([
    async.apply(listFiles, dir, '.md'),
    sortMarkdown,
  ], callback);
}

listSortedMarkdown(__dirname + '/blogs', function(err, sorted) {
  return err ? console.error('Error: %s', err)
             : console.dir(sorted);
});
于 2012-11-22T03:37:28.977 に答える