JavaScript >> Javascript 文檔 >  >> Node.js

在 Node.js/JavaScript 中讀取和寫入 YAML 到文件

簡介

在過去幾年中,YAML 代表 YAML Ain't Markup Language ,已經非常流行地用於以序列化方式存儲數據,通常是配置文件。由於 YAML 本質上是一種數據格式,因此 YAML 規範相當簡短。因此,YAML 庫所需的唯一功能是解析或生成 YAML 格式文件的能力。

在本文中,我們將了解如何將 YAML 與 Node.js 應用程序一起使用。我們將首先了解數據如何存儲在 YAML 文件中,然後將該數據加載到 JavaScript 對像中。最後,我們將學習如何將 JavaScript 對象存儲在 YAML 文件中。

有一些流行的 Node 庫用於解析和生成 YAML:yaml 和 js-yaml。 js-yaml 是兩個庫中比較流行的一個,所以我們將在本文中重點介紹。

在我們繼續之前,本教程有一些先決條件。您應該對 JavaScript 的語法有基本的了解,特別是對於 Node.js 運行時。您還需要在您的系統上安裝 Node.js 和 NPM 以跟進。除此之外,該教程對於初學者來說非常簡單易懂。

安裝

與任何 Node 包一樣,使用 NPM 進行安裝非常簡單:

$ npm install js-yaml

只需確保使用正確的標誌將依賴項保存在 package.json 文件中。例如,如果 js-yaml 僅用於開發目的,然後使用 --save-dev , 否則使用 --save 如果在您的應用的生產環境中使用。

您可以通過從同一目錄打開 REPL 並使用以下內容導入包來驗證它是否已正確安裝:

$ node
> const yaml = require('js-yaml')
>

js-yaml 庫還支持 CLI 使用,它允許您從命令行檢查 YAML 文件。您可以通過全局安裝包來啟用此功能:

$ npm install -g js-yaml

在 Node.js 中讀取 YAML 文件

我們將從讀取 YAML 格式文件並將其解析為 JS 對像開始。在本教程中,假設我們有一個文件 data.yaml ,其內容如下:

--- # Article data
article:
title: "Reading and Writing YAML to a File in Node.js/JavaScript"
url_path: "/reading-and-writing-yaml-to-a-file-in-node-js-javascript"
domain: "stackabuse.com"
port: 443
is-https: true
meta:
  published-at: "Nov. 1st, 2019"
  author:
    name: "Scott Robinson"
    contact: "[email protected]"
  tags:
    - javascript
    - node.js
    - web development

為了讀取和解析這個文件,我們將使用 .safeLoad() 方法:

// read.js
const fs = require('fs');
const yaml = require('js-yaml');

try {
    let fileContents = fs.readFileSync('./data.yaml', 'utf8');
    let data = yaml.safeLoad(fileContents);

    console.log(data);
} catch (e) {
    console.log(e);
}

運行此代碼將輸出以下內容:

$ node read.js
{ title: 'Reading and Writing YAML to a File in Node.js/JavaScript',
  'url path': '/reading-and-writing-yaml-to-a-file-in-node-js-javascript',
  domain: 'stackabuse.com',
  port: 443,
  'is-https': true,
  meta:
   { 'published-at': 'Nov. 1st, 2019',
     author: { name: 'Scott Robinson', contact: '[email protected]' },
     tags: [ 'javascript', 'node.js', 'web development' ] } }

可以看到 YAML 文件中的數據現在已經轉換為 JS 字面量和與文件結構相同的對象了。

.safeLoad() 建議使用該方法來解析 YAML 內容,因為它對於不受信任的數據是安全的。值得注意的一個限制是此方法不支持多文檔源。如果你熟悉 YAML,你就會知道 YAML 可以在一個文件中包含多個“文檔”,它們之間用 --- 分隔 句法。例如:

--- # Programming language
  language: "JavaScript"
  created-at: "December 4, 1995"
  domain: "stackabuse.com"
  creator: "Brendan Eich"
--- # Website
  domain: "wikipedia.org"
  created-at: "January 15, 2001"
  num-languages: 304
  num-articles: 51360771
  creator:
    - Jimmy Wales
    - Larry Sanger

使用 .safeLoad() 加載此文件 會拋出異常。相反,您應該使用 .safeLoadAll() 方法,像這樣:

// read-all.js
const fs = require('fs');
const yaml = require('js-yaml');

try {
    let fileContents = fs.readFileSync('./data-multi.yaml', 'utf8');
    let data = yaml.safeLoadAll(fileContents);

    console.log(data);
} catch (e) {
    console.log(e);
}

這會產生一組已解析的 YAML 文檔:

$ node read-all.js
[ { language: 'JavaScript',
    'created-at': 'December 4, 1995',
    domain: 'stackabuse.com',
    creator: 'Brendan Eich' },
  { domain: 'wikipedia.org',
    'created-at': 'January 15, 2001',
    'num-languages': 304,
    'num-articles': 51360771,
    creator: [ 'Jimmy Wales', 'Larry Sanger' ] } ]

另一個值得一提的方法是 .load() 方法,與 .safeLoad() 非常相似 , 除了它支持 all YAML 模式類型。額外支持的類型特定於 JavaScript (!!js/undefined , !!js/regexp , 和 !!js/function ) 並且您必須絕對信任這些 YAML 文件中的數據,因為它可以加載不受信任的代碼。

免費電子書:Git Essentials

查看我們的 Git 學習實踐指南,其中包含最佳實踐、行業認可的標準以及隨附的備忘單。停止谷歌搜索 Git 命令並真正學習 它!

例如,可以在 YAML 中定義一個函數,如下所示:

'toString': !<tag:yaml.org,2002:js/function> function() {console.log('Malicious code execuited!');}

該標籤告訴我們的 YAML 庫將其解析為函數,然後可以稍後執行。正如文檔中所指出的,在 JS 對像上執行的一種常用方法是 toString ,我們可以這樣利用:

// unsafe.js
const yaml = require('js-yaml');

let yamlStr = "'toString': !<tag:yaml.org,2002:js/function> function() {console.log('Malicious code execuited!');}";
let loadedYaml = yaml.load(yamlStr) + '';
console.log(loadedYaml);

運行此代碼顯示 console.log 方法確實執行了:

$ node unsafe.js 
Malicious code execuited!
undefined

將 YAML 寫入 Node.js 中的文件

現在您已經知道如何使用 Node.js 讀取 YAML 文件,讓我們看看如何將 JavaScript 對象/數據寫入 YAML 文件。

對於本示例,我們將使用以下 JS 對象,您可以從前面的示例中認出:

let data = {
    title: 'Reading and Writing YAML to a File in Node.js/JavaScript',
    'url path': '/reading-and-writing-yaml-to-a-file-in-node-js-javascript',
    domain: 'stackabuse.com',
    port: 443,
    'is-https': true,
    meta: {
        'published-at': 'Nov. 1st, 2019',
        author: {
            name: 'Scott Robinson',
            contact: '[email protected]'
        },
        tags: [
            'javascript', 'node.js', 'web development'
        ]
    }
};

為了序列化這個對象並將其保存到 YAML 格式的文件中,我們將使用 .safeDump() 方法,它再次使用 js-yamlDEFAULT_SAFE_SCHEMA

// write.js
const fs = require('fs');
const yaml = require('js-yaml');

let data = { /* Same as above */};

let yamlStr = yaml.safeDump(data);
fs.writeFileSync('data-out.yaml', yamlStr, 'utf8');

執行這段代碼會寫出一個如下所示的 YAML 文件:

title: Reading and Writing YAML to a File in Node.js/JavaScript
url path: /reading-and-writing-yaml-to-a-file-in-node-js-javascript
domain: stackabuse.com
port: 443
is-https: true
meta:
  published-at: 'Nov. 1st, 2019'
  author:
    name: Scott Robinson
    contact: [email protected]
  tags:
    - javascript
    - node.js
    - web development

此輸出與我們在本文前面閱讀的原始 YAML 幾乎相同,除了文檔分隔符 (--- ) 不包括在內。

數據類型

請務必記住,並非所有 JavaScript 數據類型都可以直接序列化為 YAML,反之亦然。在某些情況下,如果不直接支持,將盡可能使用最接近的數據類型。例如,一個 YAML !!seq type 將被解析為 JavaScript 數組。

根據js-yaml文檔,支持以下數據類型:

YAML 類型 示例 JS 類型
!!null ''
!!bool true 布爾值
!!int 3 數字
!!浮動 3.1415 數字
!!二進制 c3RhY2thYnVzZS5jb20= 緩衝區
!!時間戳 '2013-08-15' 日期
!!omap [ ... ] 鍵值對數組
!!對 [ ... ] 數組或數組對
!!設置 { ... } 具有給定鍵和空值的對像數組
!!str '...' 字符串
!!seq [ ... ] 數組
!!地圖 { ... } 對象

如前所述,也可以支持其他特定於 JS 的類型,但前提是您不使用“安全”方法。

結論

YAML 是一種越來越流行的格式,用於為應用程序構建數據,通常作為配置文件,但也可以替代 JSON 用於任何用途。由於其高度的靈活性和易於閱讀的語法,它正在許多項目中迅速取代 JSON,儘管它們仍然佔有一席之地。

在本文中,我們展示瞭如何使用 js-yaml 用於將 YAML 文件解析為 Node.js 中的 JavaScript 對象的庫,以及如何將 JavaScript 對象序列化為 YAML 文件。我們還展示了用於各種 YAML 數據類型的 JS 類型。有關此庫的更多詳細信息,請查看官方文檔。


Tutorial JavaScript 教程
  1. 使用 Twilio Live 構建您自己的直播應用程序

  2. 數據表請求的未知參數“PageId”

  3. 一種簡單的算法方法(第 1 部分)

  4. 匹配以特殊字符開頭或結尾的整個單詞

  5. 通過 D3 和 React 進行籃球統計

  6. react-router v6 揭秘(第 2 部分)

  7. Pajama SSG - 使用 Node.js 的簡單靜態站點生成器

  1. 在開發者晚宴上通過 React 虛張聲勢

  2. 5 分鐘了解 GraphQL

  3. JavaScript 中的 document.createElement 函數

  4. 如何過濾()你的學校午餐,因為沒有人想要肉餅

  5. 退出 JavaScript 循環:“中斷”和“繼續”[示例]

  6. ngTemplateOutlet:定制的秘訣

  7. 循環

  1. 如何像專業人士一樣在 JavaScript 中使用數組?

  2. let、const 和 var 關鍵字在 JavaScript 中的工作原理

  3. [React] 使用 Apexcharts 實時更新數據 - JSON API

  4. RecoilJS 的狀態