11

因此,我正在运行一个小型测试应用程序,以在访问路由时以 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:无法调用未定义的“替换”方法请将此报告给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 进行异步编程

承诺.js

Bluebird(另一个承诺库)

于 2015-01-15T20:00:35.883 回答