Hexo new 日期无法自动生成且出现 object Object 报错根治 | 排坑笔记
1. 现象与复现
在使用 Hexo 撰写技术博客时,常规流程是通过 CLI 命令快速创建草稿或文章:
1 | # 执行标准新建命令 |
正常情况下,Hexo 应该依据全局配置的 date_format 与 time_format,自动将当前系统的真实时间写入 frontmatter 的 date 字段。但在异常配置下,生成的文件顶部却呈现如下异常:
1 |
|
此时不仅时间戳缺失,甚至连传给 CLI 的文章标题也一同损坏。博主每次新建文章都不得不手动删除冗余字符,并人肉打上 YYYY-MM-DD HH:mm:ss,严重拖慢写作节奏。
2. 根本原因解析
这一诡异故障由 模板引擎变量匹配失败 与 YAML 语法容错回退 叠加引发:
2.1 模板引擎语法失效
Hexo 的脚手架系统(位于站点根目录的 scaffolds/ 文件夹)底层依托模板引擎(如 Nunjucks / Swig)对文件进行编译。
在标准规范中,变量占位符必须为严格闭合的双花括号:
- 正确语法:
{{ date }}和{{ title }} - 错误语法:
{ { date } }和{ { title } }(花括号之间多了一个空格)
一旦花括号之间存在空格,模板引擎的正则解析器便无法匹配到变量标识符,模板变量直接原样穿透,未被替换为实际的当前时间字符串。
2.2 YAML 解析器的误判与序列化退化
未被替换的 { { date } } 随后被交给 Hexo 的 YAML 解析库(js-yaml)。
在 YAML 语法中,花括号 {} 代表内联映射(Flow Mapping,即 JSON 格式的对象)。当解析器读到:
1 | date: { { date } } |
解析器将其理解为:一个名为 date 的键,其值是一个内联字典,而这个字典的 Key 本身也是一个字典对象。在 JavaScript 的运行时中,一个对象作为字典的 Key 时会被强制执行 toString(),从而变为 "[object Object]"。当 Hexo 把这个内存对象重新序列化写入磁盘文件时,就变成了:
1 | date: |
3. 彻底解决方案
定位到原因后,修复过程非常简单且直接。
步骤一:修正脚手架中的变量语法
检查项目根目录下的 scaffolds/ 目录,重点排查默认的 post.md:
1 | --- scaffolds/post.md |
确保花括号内侧无多余空格,且建议将 title 用英文双引号包裹(防止文章标题中包含冒号、方括号等字符导致 YAML 语法报错)。
步骤二:自定义脚手架模板(可选调优)
如果你为博客配置了多种专有模板(例如 troubleshooting.md、devlog.md、tutorial.md),确保每一个脚手架文件中的 date 均声明为 {{ date }}。
例如本站的排坑笔记脚手架 scaffolds/troubleshooting.md:
1 |
|
4. 验证与避坑要点
- 一键新建验证:
在终端执行新建测试命令:检查生成的 Markdown 头部,确认时间已被全自动、精确到秒地填入:1
npx hexo new troubleshooting "终端网络连接超时排查"
1
2
3
4
5
6
7
title: 终端网络连接超时排查 | 排坑笔记 | 阿尔的代码屋
date: 2026-09-09 22:45:10
categories:
- 排坑笔记
- 环境配置 - 时区与时间格式:
若自动生成的日期格式不符合预期,检查根目录_config.yml:1
2
3
4# 推荐配置标准 ISO / 本地时间格式
timezone: Asia/Shanghai
date_format: YYYY-MM-DD
time_format: HH:mm:ss