记录 Hexo 升级或使用时遇到的问题和一些解决方案。
TypeError: config._d.getTime is not a function 经过排查,本次发生错误是由 hexo-related-popular-posts
引发,在该库源码中使用 moment
初始化 list.date
导致了错误。 list.date
通过打印值可以看到是一个 moment
对象,但这个 moment
对象并不规范或者说可能在某处修改了这个 moment
对象的值。
moment
内部初始化有一段逻辑是:
1 this ._d = new Date (config._d != null ? config._d.getTime() : NaN );
这个 config
就是 moment(list.date)
传入的 list.date
的值。config._d
是一个时间类型的字符串 ,并不是 Date
类型,因此没有 getTime
的方法。
临时解决方法有两种,一是将 theme/next/_config.yml
中的 related_posts.params.isDate
设为 false
,也就是推荐列表中不展示时间。
二是修改源码,做一层错误处理。从 node_modules
中打开文件(\node_modules\hexo-related-popular-posts\lib\list-json.js), 在编辑器中查找以下代码:
1 2 3 if (inOptions.isDate && list.date != '' ) { ret.date = moment(list.date).format(config.date_format || 'YYYY-MM-DD' ) }
修改为:
1 2 3 4 5 6 7 if (inOptions.isDate && list.date != '' ) { try { ret.date = moment(list.date).format(config.date_format || 'YYYY-MM-DD' ) } catch (ex) { ret.date = moment(list.date._d).format(config.date_format || 'YYYY-MM-DD' ) } }
上述只是临时的解决方案,由于不好确定是哪一方的原因,也不想继续耗费太多精力在上面。
错误日志如下,以供参考:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Unhandled rejection Template render error: (C:\Users\user\Desktop\project\blog\themes\next\layout\post.njk) Template render error: (C:\Users\user\Desktop\project\blog\themes\next\layout\post.njk) Template render error: (C:\Users\user\Desktop\project\blog\themes\next\layout\post.njk) [Line 19, Column 14] Template render error: (C:\Users\user\Desktop\project\blog\themes\next\layout\post.njk) Template render error: (C:\Users\user\Desktop\project\blog\themes\next\layout\_partials\head\head-unique.njk) [Line 10, Column 23] Template render error: (C:\Users\user\Desktop\project\blog\themes\next\layout\post.njk) [Line 3, Column 3] Template render error: (C:\Users\user\Desktop\project\blog\themes\next\layout\post.njk) Template render error: (C:\Users\user\Desktop\project\blog\themes\next\layout\_partials\header\index.njk) [Line 6, Column 15] Template render error: (C:\Users\user\Desktop\project\blog\themes\next\layout\post.njk) Template render error: (C:\Users\user\Desktop\project\blog\themes\next\layout\_partials\header\sub-menu.njk) [Line 2, Column 29] Template render error: (C:\Users\user\Desktop\project\blog\themes\next\layout\post.njk) Template render error: (C:\Users\user\Desktop\project\blog\themes\next\layout\_partials\header\sub-menu.njk) Template render error: (C:\Users\user\Desktop\project\blog\themes\next\layout\post.njk) [Line 5, Column 3] Template render error: (C:\Users\user\Desktop\project\blog\themes\next\layout\post.njk) [Line 9, Column 12] Template render error: (C:\Users\user\Desktop\project\blog\themes\next\layout\_macro\post.njk) [Line 214, Column 16] Template render error: (C:\Users\user\Desktop\project\blog\themes\next\layout\_partials\post\post-related.njk) TypeError: config._d.getTime is not a function at Object._prettifyError (C:\Users\user\Desktop\project\blog\node_modules\nunjucks\src\lib.js:36:11) at C:\Users\user\Desktop\project\blog\node_modules\nunjucks\src\environment.js:561:19 at Template.root [as rootRenderFunc] (eval at _compile (C:\Users\user\Desktop\project\blog\node_modules\nunjucks\src\environment.js:631:18), <anonymous>:45:3) at Template.render (C:\Users\user\Desktop\project\blog\node_modules\nunjucks\src\environment.js:550:10) at C:\Users\user\Desktop\project\blog\themes\next\scripts\renderer.js:35:29 at _View._compiled.locals [as _compiled] (C:\Users\user\Desktop\project\blog\node_modules\hexo\lib\theme\view.js:136:50) at _View.render (C:\Users\user\Desktop\project\blog\node_modules\hexo\lib\theme\view.js:39:17) at C:\Users\user\Desktop\project\blog\node_modules\hexo\lib\hexo\index.js:64:21 at tryCatcher (C:\Users\user\Desktop\project\blog\node_modules\bluebird\js\release\util.js:16:23) at C:\Users\user\Desktop\project\blog\node_modules\bluebird\js\release\method.js:15:34 at RouteStream._read (C:\Users\user\Desktop\project\blog\node_modules\hexo\lib\hexo\router.js:47:5) at RouteStream.Readable.read (_stream_readable.js:470:10) at resume_ (_stream_readable.js:949:12) at process._tickCallback (internal/process/next_tick.js:63:19)