使用 express 和 marked 返回呈现的降价

returning rendered markdown with express and marked

所以我是 运行 一个小型测试应用程序,用于在访问路由时 return html 中 markdown 文件的内容。我正在使用标记来呈现降价 (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 都不熟悉,所以我还在想办法。非常感谢任何帮助。

如果你想把文件的数据赋值给一个变量,你应该试试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。

承诺信息:

Asynchronous Programming in JavaScript with Promises

Promise.js

Bluebird(另一个承诺库)