[facebook/docusaurus]Front Matter 验证不会打印良好的错误消息

2024-05-10 275 views
6
描述
ValidationError: "title" must be a string

没有上下文,我不知道该看哪里

https://github.com/wenerme/wener/actions/runs/3286799524/jobs/5415286638

可重现的演示

没有反应

重现步骤
git clone git@github.com:wenerme/wener.git
cd wener/site

pnpm install
make build
预期行为

像以前一样工作

实际行为
[ERROR] The following front matter:
---
title: null
---
contains invalid values for field(s): `title`.

- "title" must be a string

[ERROR] Loading of version failed for version current
[ERROR] Unable to build website for locale en.
[ERROR] ValidationError: "title" must be a string
您的环境
  • 公共源代码:https://github.com/wenerme/wener
  • 公共站点网址:https://wener.me
  • 使用的 Docusaurus 版本:2.1.0
  • 环境名称和版本(例如 Chrome 89、Node.js 16.4):
  • 操作系统和版本(例如Ubuntu 20.04.2 LTS):

回答

7

嘿,

您有一个 Markdown 文件,其中包含title: null验证不允许的 frontmtter。这是预期的行为。

没有上下文,我不知道该看哪里

我同意我们不容易找到有问题的原始 md 文件,所以我将其视为一个错误:我们至少应该在错误消息中打印文件路径

像以前一样工作

它究竟意味着什么?之前具体是如何运作的?你做了什么改变导致了这次新的失败?

2

在我们的代码中添加了本地 try/catch 并能够打印有问题的文档:

Inject custom docs filter
[ERROR] The following front matter:
---
title: null
---
contains invalid values for field(s): `title`.

- "title" must be a string

failed to process doc {
  source: 'web/framework/uniapp.md',
  content: '---\n' +
    'title:\n' +
    '---\n' +
    '\n' +
    '# uniapp\n' +
    '\n' +
    '- [dcloudio/uni-app](https://github.com/dcloudio/uni-app)\n' +
    '  - Apache-2.0, Vue\n',
  contentPath: '/home/wenerme/wener/notes',
  filePath: '/home/wenerme/wener/notes/web/framework/uniapp.md'
}
[ERROR] The following front matter:
---
title: null
---
contains invalid values for field(s): `title`.

- "title" must be a string

[ERROR] Loading of version failed for version current
[ERROR] ValidationError: "title" must be a string
[INFO] Docusaurus version: 2.1.0
Node version: v16.14.2
 ELIFECYCLE  Command failed with exit code 1.
7

我们应该打印更好的错误消息,不幸的是,失败被吞没了,因为我们不等待返回的承诺:

export function processDocMetadata(args: {
  docFile: DocFile;
  versionMetadata: VersionMetadata;
  context: LoadContext;
  options: MetadataOptions;
  env: DocEnv;
}): Promise<DocMetadataBase> {
  try {
    return doProcessDocMetadata(args);
  } catch (err) {
    logger.error`Can't process doc metadata for doc at path path=${args.docFile.filePath} in version name=${args.versionMetadata.versionName}`;
    throw err;
  }
}

错误被正确捕获/打印在调用堆栈的上部:

[ERROR] Loading of version failed for version current
[ERROR] ValidationError: "title" must be a string

也是用新的错误原因系统替换此代码的好机会(我们的 Node.js 版本支持它)


对于外部贡献者来说,这是需要解决的第一个问题。

如果您可以处理,请直接发送 PR(不要要求认领)。

1

@slorber 我希望更多地参与更大的开源项目 - 这看起来是一个很好的第一次机会。

也是用新的错误原因系统替换此代码的好机会(我们的 Node.js 版本支持它

您能否指出在哪里可以找到有关您提到的错误原因系统的更多信息以及如何利用它来解决此问题?

与此同时,我将尝试自行修复此问题 - 谢谢!

9

@shermanhui 如上所述,如果你想贡献,可以直接打开 PR。如果我必须花时间向你解释事情,我自己解决 bug 会更快。错误原因是一个标准的 EcmaScript 功能,您可以在 Google 或规范中找到所有内容

@shanpriyan 已经打开了一个 PR,所以现在解决这个问题已经太晚了,但是如果您愿意,您可以向另一个问题打开一个 PR

3

嘿,你能把这个问题分配给我吗?

8

@Jaya-sys 我们不会将任何问题分配给那些甚至不愿意阅读之前有关该问题的评论的人。请负责

5

原因已找到,但问题是缺少文件上下文

@wenerme 这是一个不同的问题,我建议用适当的重现为其打开另一个问题。虽然不确定我们能做些什么,但如果我们有足够好的重现,我们至少可以研究一下。