用快速和标记返回渲染的降价

sal*_*der 7 markdown node.js express javascript-marked

因此,我正在运行一个小型测试应用程序,以便在访问路径时以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))
})
Run Code Online (Sandbox Code Playgroud)

当我导航到localhost:3000时,我得到了 -

TypeError:无法调用undefined方法'replace'请将此报告给https://github.com/chij/marked.

我很确定我正在尝试发送一个字符串,而res.send('Hello World!')的工作正常.对不起,我是Node和express的新手,所以我还在搞清楚.任何帮助深表感谢.

Bra*_*ldi 11

如果要将文件的数据分配给变量,则应尝试使用该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()));
});
Run Code Online (Sandbox Code Playgroud)

异步解决方案

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()));
  });
});
Run Code Online (Sandbox Code Playgroud)

有希望的解决方案

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()));
  });
});
Run Code Online (Sandbox Code Playgroud)

因为异步编程将继续下一步,在单独的线程中运行前一个步骤,访问在回调函数之外异步分配的数据可能会导致竞争条件.如果要异步使用它,可以在异步回调函数中处理响应,也可以将其转换为promise.

承诺信息:

带有Promise的JavaScript中的异步编程

Promise.js

蓝鸟(另一个承诺lib)