Возвращение предоставленной уценки с экспрессом и пометкой

Поэтому я запускаю небольшое тестовое приложение для возврата содержимого файла уценки в 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 я получаю -

Ошибка типа: Невозможно вызвать метод replace вместо undefined Пожалуйста, сообщите об этом на https://github.com/chij/marked.

Я почти уверен, что пытаюсь отправить строку, и это res.send ("Hello World!") Работает просто отлично. Извините, я новичок как в Node, так и в экспрессе, так что я все еще разбираюсь. Буду признателен за любую оказанную помощь.

1 ответ

Решение

Если вы хотите присвоить данные файла переменной, попробуйте 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()));
  });
});

Поскольку асинхронное программирование переходит к следующему шагу, выполнение предыдущего в отдельном потоке, доступ к данным, назначенным асинхронно вне функции обратного вызова, может привести к состоянию состязания. Если вы хотите использовать его асинхронно, вы можете либо обработать ответ внутри функции асинхронного обратного вызова, либо преобразовать его в обещание.

Информация об обещаниях:

Асинхронное программирование в JavaScript с обещаниями

Promise.js

Синяя птица (Еще одно обещание lib)

Другие вопросы по тегам