11

そのため、ルートにアクセスしたときにマークダウン ファイルの内容を html で返す小さなテスト アプリケーションを実行しています。マークダウンをレンダリングするためにマークを使用しています ( https://github.com/chjj/marked )。

これが私がこれまでに持っているものです-

app.get('/test', function(req, res) {
  var path = __dirname + '/markdown/test.md'
  var file = fs.readFile(path, 'utf8', function(err, data) {
    if(err) {
      console.log(err)
    }
    return data.toString()
  })
  res.send(marked(file))
})

localhost:3000 に移動すると、-

TypeError: 未定義のメソッド 'replace' を呼び出せませんhttps://github.com/chij/markedに報告してください。

文字列を送信しようとしているのは確かで、 res.send('Hello World!') は問題なく動作します。申し訳ありませんが、私は Node と Express の両方に慣れていないので、まだ解決していません。どんな助けでも大歓迎です。

4

1 に答える 1

17

ファイルのデータを変数に代入したい場合は、fs.readFileSync()メソッドを試してみてください。

同期ソリューション

app.get('/test', function(req, res) {
  var path = __dirname + '/markdown/test.md';
  var file = fs.readFileSync(path, 'utf8');
  res.send(marked(file.toString()));
});

非同期ソリューション

app.get('/test', function(req, res) {
  var path = __dirname + '/markdown/test.md';
  fs.readFile(path, 'utf8', function(err, data) {
    if(err) {
      console.log(err);
    }
    res.send(marked(data.toString()));
  });
});

約束された解決策

var Promise = require('bluebird'); // Require 'bluebird' in your package.json file, and run npm install.
var fs = require('fs');
var path = require('path');
Promise.promisifyAll(fs);

app.get('/test', function (req, res) {
  fs.readFileAsync(path.join(__dirname, '/markdown/test.md')).then(function(val) {
    res.send(marked(val.toString()));
  });
});

非同期プログラミングは次のステップに進み、前のステップを別のスレッドで実行するため、コールバック関数の外部で非同期に割り当てられたデータにアクセスすると、競合状態が発生する可能性があります。非同期で使用する場合は、非同期コールバック関数内で応答を処理するか、promise に変換できます。

約束に関する情報:

Promise を使用した JavaScript での非同期プログラミング

Promise.js

Bluebird (別の約束 lib)

于 2015-01-15T20:00:35.883 に答える