最近做了一个markdown的个人博客,基于node+express的,前端模版基于ejs,开始是将原始markdown返到页面的标签里,然后用 https://github.com/chjj/marked 解析的,高亮用的highlight官网的js,在html中是这么调用的:
js
marked.setOptions({ renderer: new marked.Renderer(), gfm: true, tables: true, breaks: true, pedantic: false, sanitize: false, smartLists: false, smartypants: false, highlight: function (code) { return hljs.highlightAuto(code).value; } }); var article = $('#article').val(); $('.article').html(marked(article));
上边的代码时可行的。
现在我想直接在node里将markdown解析成html,是这么写的,
js
var marked = require('marked'), hljs = require('../public/js/highlight/highlight.pack.js'); marked.setOptions({ renderer: new marked.Renderer(), gfm: true, tables: true, breaks: true, pedantic: false, sanitize: false, smartLists: false, smartypants: false, highlight: function (code) { return hljs.highlightAuto(code).value; } }); ... router.get('/a/:id', function (req, res) { Post.getOne(req.params.id, function (err, post) { if (err) { req.flash('error', err); return res.redirect('/'); } res.render('article', { title: post.title, curIndex: 0, article: marked(post.post), post: post, user: req.session.user, success: req.flash('success').toString(), error: req.flash('error').toString() }); }); });
但是提示 undefined is not a function
,望高人指点,谢谢
报错的是指哪个undefined
,marked
还是highlight
,我最近也写了点类似的东西,marked+highlight
是可以用的。
js
"use strict"; ///<reference path="../../typings/node/node.d.ts" /> var marked = require('marked'); var hljs = require('highlight.js'); var thunkify = require('thunkify-wrap'); var ArticleModel = require('../models/article'); marked.setOptions({ renderer: new marked.Renderer(), gfm: true, tables: true, breaks: false, pedantic: false, sanitize: true, smartLists: true, smartypants: false, highlight: function (code) { return hljs.highlightAuto(code).value; } }); exports.fetch = function *(){ var articleId = this.params['articleId']; var result = yield thunkify(ArticleModel.findById,ArticleModel)(articleId); if (!result) { return this.send(null,1,"文章不存在"); } result.content = marked(result.content); this.send(result,0); }
时隔一年啊。。。
好吧,我也是遇到这样的问题。。。
不过我已经解决了,留下我的解决方式给以后的人作为参考吧。。。
首先是这个undefined的问题,这个是因为,你使用的highlight.js是前端用的js文件,它的封装是这样的:
(function(xxx){
/*省略一堆代码*/
window.hljs=hljs
})(xxx)
也就是说,你在前端调用的时候,引入这个.js文件,然后直接在你的js里面调用就ok了。但是,在node里面,一切外部引入的js都依赖于require
这个函数,而这个函数引入的.js里面又必须使用module.exports
暴露出来。很明显,上面的那种没有这种暴露写法,require进来后因为作用域问题无法调用,所以用不了hljs
,所以是个undefined
。。。这应该算是require的一个闭包问题吧。。。
然后是解决办法。。。我直接就推荐一个最简单粗暴的办法吧。。。
检查下项目里node_modules文件夹下面是否存在highlight.js这个包,注意,文件名后面是有带.js的:
如果没有的话,npm install highlight.js
或者在package.json里面添加
然后,把
hljs = require('../public/js/highlight/highlight.pack.js');
改为
hljs = require('highlight.js');
然后就ok拉~(≧▽≦)/~
强烈推荐Gitblog来写博客。
Gitblog是一个简单易用的Markdown博客系统,它不需要数据库,没有管理后台功能,更新博客只需要添加你写好的Markdown文件即可。 它摆脱了在线编辑器排版困难,无法实时预览的缺点,一切都交给Markdown来完成,一篇博客就是一个Markdown文件。 同时也支持评论,代码高亮,数学公式,页面PV统计等常用功能。 Gitblog提供了不同的主题样式,你可以根据自己的喜好配置,如果你想自己制作博客主题,也是非常容易的。 Gitblog还支持整站静态导出,你完全可以导出整站静态网页部署到Github Pages。
Gitblog官方网站
http://www.gitblog.cn/