【问题标题】:node.js file with yaml header带有 yaml 标头的 node.js 文件
【发布时间】:2016-05-01 16:03:17
【问题描述】:

我有一些 node.js 脚本文件,我需要向其中添加某种文本元数据并从另一个 node.js 应用程序中读取这些元数据。 我尝试像这样使用带注释的 yaml 标头:

//someScript.js
/**
---
Title: some script
Description: script which does some things.
Params:
  -param1
  -param2
---
**/

//actual script code..

然后使用front-matter:

//app.js
var frontMatter = require('yaml-front-matter')
var results = frontMatter.loadFront('someScript.js');

但是“结果”返回了“_content”键中的所有代码和 yaml,并且没有正确解析 yaml。

您知道实现此要求的另一种方法吗?或者也许是另一个类似的问题解决方案?一般来说,我想获取脚本的名称、参数和描述以用于显示目的。 它不一定是 yaml 元数据 - 任何文本元数据都可以,但我没有找到另一个合理的选择。

提前致谢!

编辑:javascirpt 脚本文件应该采用有效的 javascript 语法,以便我可以实际执行它们,这就是我将 yaml 代码编写为注释的原因

【问题讨论】:

    标签: javascript node.js yaml


    【解决方案1】:

    yaml-front-matter 模块设置为读取常规的.yaml 文件,而不是 Cmets 中 YAML 前端的 JavaScript 文件。所以,假设我们有someFile.yaml,而不是someScript.js

    someFile.yaml 在这种情况下的内容是:

    ---
    Title: some script
    Description: script which does some things.
    Params:
      -param1
      -param2
    ---
    
    Your YAML content.
    

    你现在可以这样做:

    var frontMatter = require('yaml-front-matter');
    var yaml = frontMatter.loadFront('./wow.yaml');
    
    console.log(yaml);
    

    以下将被记录到控制台。

    { Title: 'some script',
      Description: 'script which does some things.',
      Params: '-param1 -param2',
      __content: '\n\nYour YAML content.\n' }
    

    如果您的 YAML 代码的内容是您想要执行的某种代码(这可能就是为什么您在 JavaScript 文件中包含此前端的原因),那么您可以使用像 safe-eval 这样的模块或 Node 的内置-在vm.runInThisContext() 方法中。

    【讨论】:

    • 嗨史蒂夫,YAML 代码不可执行,但文件内容的其余部分(//实际脚本代码.. 行)。 yaml-fring-matter 库希望 yaml 位于文件的开头,但如果没有 cmets,这不是有效的 javascript 语法
    • 是的,我怀疑有了这个特殊的图书馆,你不能吃蛋糕。该库本身只能解析我们可能认为的博客文章或没有可执行代码的纯内容。您可以使用safe-evalvmRunInThisContent 获取__content 属性中的静态内容并像有效JavaScript 一样执行它(在技术上这就是您的情况)。这可能是您最好的选择。
    【解决方案2】:

    如果我简单地更改它以使其看起来像记录在案(不包含在 cmets 中并且顶部没有文件名注释,在 yaml 开始之前也没有换行符),则对我有用

    ---
    Title: some script
    Description: script which does some things.
    Params:
      -param1
      -param2
    ---
    
    //actual script code..
    

    记录 frontmatter.loadFront() 的输出

    { Title: 'some script',
      Description: 'script which does some things.',
      Params: '-param1 -param2',
      __content: '\n\n//actual script code..\n' }
    

    【讨论】:

    • 嗨,这实际上可以工作,但问题是脚本文件必须保持 javascript 有效的语法,这样我才能真正执行它,这就是我注释掉 yaml 标头的原因。
    • 在这种情况下,我认为唯一的解决方案是请求将此功能添加到 frontmatter 存储库中,或者自己添加并创建拉取请求。至少据我所知,没有任何事情会按照你想要的方式做到这一点。
    猜你喜欢
    • 2011-09-14
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 2022-06-30
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多