在 JavaScript (Node.js) 中使用 YAML:解析、生成与验证

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 JavaScript (Node.js) 中使用 YAML:完整指南



YAML(YAML Ain't Markup Language)是一种人类可读的数据序列化格式,广泛用于配置文件、API 描述、CI/CD 流水线和数据交换。在 Node.js 生态系统中,有几个强大的库可用于处理 YAML。本文将详细介绍主要工具、它们的功能以及使用示例。



Node.js 中流行的 YAML 库



在 Node.js 环境中,最常用的 YAML 库包括:



  • js-yaml — 最流行且维护最活跃的库。支持全套操作:解析、序列化、自定义模式和类型。
  • yaml(yaml 包) — 现代替代方案,支持严格解析、注释和 AST(抽象语法树)。
  • yamljs — 轻量级库,API 简单,适合基本任务。


安装 js-yaml 库



要开始在 Node.js 中使用 YAML,请通过 npm 安装该库:



npm install js-yaml


安装后,将库导入到您的项目中:



const yaml = require('js-yaml');const fs = require('fs');


将 YAML 解析为 JavaScript 对象



基本操作是将 YAML 字符串转换为 JavaScript 对象:



const yamlString = `server:  host: localhost  port: 8080  ssl: truedatabases:  - name: users    type: postgres  - name: logs    type: mongodb`;

try { const data = yaml.load(yamlString); console.log(data.server.host); // "localhost" console.log(data.databases[0].name); // "users"} catch (e) { console.error('YAML 解析错误:', e.message);}


yaml.load() 方法可以安全地将 YAML 字符串转换为对象。要从文件加载,请使用:



try {  const config = yaml.load(fs.readFileSync('config.yaml', 'utf8'));  console.log(config);} catch (e) {  console.error('读取配置错误:', e);}


将 JavaScript 对象序列化为 YAML



反向操作是将对象转换为 YAML 字符串:



const configObject = {  app: {    name: "MyApp",    version: "1.0.0"  },  features: ["auth", "logging", "analytics"],  database: {    host: "db.example.com",    port: 5432  }};

const yamlString = yaml.dump(configObject, { indent: 2, lineWidth: 120, noRefs: true});

console.log(yamlString);// 输出:// app:// name: MyApp// version: 1.0.0// features:// - auth// - logging// - analytics// database:// host: db.example.com// port: 5432


yaml.dump() 方法的参数:

  • indent — 缩进的空格数(默认为 2)
  • lineWidth — 最大行长度(默认为 80)
  • noRefs — 禁用锚点和引用
  • skipInvalid — 跳过无效值而不是抛出错误


使用自定义 YAML 类型



js-yaml 支持自定义模式和数据类型。例如,可以添加对日期的支持:



const yaml = require('js-yaml');

// 创建支持日期的自定义模式const schema = yaml.DEFAULT_SCHEMA.extend([ new yaml.Type('tag:yaml.org,2002:timestamp', { kind: 'scalar', resolve: (data) => { return !isNaN(Date.parse(data)); }, construct: (data) => { return new Date(data); }, instanceOf: Date, represent: (date) => { return date.toISOString(); } })]);

const yamlString = 'event_date: 2024-03-15T14:30:00Z';const parsed = yaml.load(yamlString, { schema });console.log(parsed.event_date inst

推荐