如何在express.js的jade模板中渲染markdown?

13

我使用express js框架。我从数据库中获取了一个Markdown格式的字符串,并希望在我的jade模板中将其呈现为HTML。我安装了node-markdown并想以以下方式呈现它:

app.js

var md = require("node-markdown").Markdown;

template.jade

->

模板.jade

- each note in todo.notes
  div= md(note.string)

然而,它没有打印出任何东西...... 你有什么建议吗?

谢谢!

编辑:我自己解决了,只是忘了将md变量传递到视图中...


3
我建议你回答并接受自己的问题,并提到如何将md变量注入视图中。 - Raynos
1
你能否发布一下你是如何实现这个的答案? - hellatan
1
对于2016年来到这里的人:Jade现在被称为Pug - sshow
5个回答

14

4
虽然这个答案是正确的,但它并没有具体回答这个问题,因为“过滤器在编译时确定。这使它们快速,但意味着它们无法支持动态内容。” - Pier-Luc Gendreau

10

我自己找到了解决方案:

问题在于,我忘记将md变量传递到视图中。因此,要使节点Markdown模块运行,您需要执行以下操作:

app.js头文件

var md = require("node-markdown").Markdown;

app.js路由(传递md变量)

...
res.render('template', { vars: { foo: foo_.bar }, md: md, layout: false });
...

template.jade

...
div!= md(note.string)
...

感谢您发布您的内容。我可以让我的Markdown渲染到页面上,但是所有输出都作为HTML实体,因此在页面上看到了实际的标记。您是否遇到过类似的问题? - hellatan
2
我找到了为什么它输出为转义的HTML的原因 - 我没有使用 div!= md(str) 来防止渲染器对HTML进行消毒。 - hellatan
2
如果您经常使用一个变量,将其写入app.locals可能是个好主意。这样,您可以在视图中直接访问它,而不必将其传递给每个视图。 - Jascha Ehrenreich
根据您的渲染需求,您不需要使用 div,可以直接这样使用:!= md(note.string) - Pier-Luc Gendreau

7

节点模块node-markdown已经被弃用。新版本marked更加先进。您可以尝试以下方式:

var md = require('marked');

在你的路由器内部

res.render('template', { md: md });

在你的jade模板中
div!= md(note.string)

2
如果你正在使用Marked,在你的Jade文件中,你可以做些非常简单的事情,比如这样:

如果你正在使用Marked,在你的Jade文件中,你可以做一些非常简单的事情:

extends layout

block content
    include:md ../../public/docs/getting-started.md

这对我不起作用。我得到了类似“md不是过滤器”的东西。 - Maria Ines Parnisari

0
你可以使用marked,然后按照以下说明进行操作:

app.js

app.locals.md = require('marked').setOptions({ breaks: true })

现在你可以在Jade模板中随时调用该函数,例如在你的情况下:

template.jade

- each note in todo.notes
    div!= md(note.string)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接