素材牛VIP会员
大晚上的问大伙个Markdown & highlight的问题
 lu***ng  分类:Node.js  人气:1035  回帖:4  发布于6年前 收藏

最近做了一个markdown的个人博客,基于node+express的,前端模版基于ejs,开始是将原始markdown返到页面的标签里,然后用 https://github.com/chjj/marked 解析的,高亮用的highlight官网的js,在html中是这么调用的:

jsmarked.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,是这么写的,

jsvar 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,望高人指点,谢谢

 标签:node.jsjavascript

讨论这个帖子(4)垃圾回帖将一律封号处理……

Lv3 码奴
风***灬 页面重构设计 6年前#1

报错的是指哪个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);
}
Lv1 新人
飘***子 JS工程师 6年前#2

虽然 highlight 官方说 highlight 兼容 nodejs,但始终没找到相关应用的文档……

Lv5 码农
风***飞 CEO 6年前#3

时隔一年啊。。。
好吧,我也是遇到这样的问题。。。
不过我已经解决了,留下我的解决方式给以后的人作为参考吧。。。

  • 首先是这个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拉~(≧▽≦)/~

Lv6 码匠
hx***lf JAVA开发工程师 6年前#4

强烈推荐Gitblog来写博客。

Gitblog是一个简单易用的Markdown博客系统,它不需要数据库,没有管理后台功能,更新博客只需要添加你写好的Markdown文件即可。 它摆脱了在线编辑器排版困难,无法实时预览的缺点,一切都交给Markdown来完成,一篇博客就是一个Markdown文件。 同时也支持评论,代码高亮,数学公式,页面PV统计等常用功能。 Gitblog提供了不同的主题样式,你可以根据自己的喜好配置,如果你想自己制作博客主题,也是非常容易的。 Gitblog还支持整站静态导出,你完全可以导出整站静态网页部署到Github Pages。

Gitblog官方网站

http://www.gitblog.cn/

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取