Чтение и запись YAML в файл в Node.js / JavaScript

2 min


Введение

В последние несколько лет YAML, что означает YAML не является языком разметки, стал очень популярным для использования в хранении данных в последовательном порядке, как правило, файлы конфигурации. Поскольку 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

Чтение YAML-файлов в Node.js

Начнем с чтения файла в формате YAML и его анализа в объекте JS. Ради этого урока, скажем, у нас есть файл, data.yaml, который имеет следующее содержание:

--- # Article 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

Чтобы прочитать и проанализировать этот файл, мы будем использовать .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()разве что поддерживает все Типы схем YAML, Дополнительные поддерживаемые типы относятся к JavaScript (!!js/undefined, !!js/regexp, а также !!js/function) и вы должны абсолютно доверять данным в этих файлах YAML, поскольку они могут загружать недоверенный код.

Например, функция может быть определена в YAML следующим образом:

'toString': ! function() {console.log('Malicious code execuited!');}

Этот тег говорит нашей библиотеке YAML, чтобы она анализировалась как функция, которая затем может быть выполнена позже. Как указано в документации, один общий метод, который выполняется на объектах JS, toString, который мы можем использовать так:

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

let yamlStr = "'toString': ! 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

Теперь, когда вы знаете, как читать файлы YAML с помощью Node.js, давайте посмотрим, как мы можем записать объекты / данные 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-yaml«s DEFAULT_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 Тип будет проанализирован как массив JavaScript.

Согласно JS-YAML документацияподдерживаются следующие типы данных:

Тип YAML пример Тип JS

!!значение NULL

''

значение NULL

!! BOOL

true

BOOL

!! ИНТ

3

номер

!! поплавка

3.1415

номер

!! бинарная

c3RhY2thYnVzZS5jb20=

буфер

!! метка времени

'2013-08-15'

свидание

!! OMAP

( ... )

массив пар ключ-значение

!! пар

( ... )

массив или пары массивов

!!установлен

{ ... }

массив объектов с заданными ключами и нулевыми значениями

!! ул

'...'

строка

!! сл

( ... )

массив

!!карта

{ ... }

объект

Как упоминалось ранее, другие специфичные для JS типы также могут поддерживаться, но только если вы не используете «безопасные» методы.

Заключение

YAML – это все более популярный формат, используемый для структурирования данных для приложений, как правило, в виде файлов конфигурации, но также и для замены всего, для чего используется JSON. Благодаря высокой гибкости и простоте чтения синтаксиса, он быстро заменяет JSON во многих проектах, хотя у обоих все еще есть свое место.

В этой статье мы показали, как вы можете использовать js-yaml библиотека для разбора файлов YAML на объекты JavaScript в Node.js и как вы можете сериализовать объекты JavaScript в файл YAML. Мы также показали, какие типы JS используются для различных типов данных YAML. Для получения более подробной информации об этой библиотеке, проверьте официальная документация,


0 Comments

Ваш e-mail не будет опубликован. Обязательные поля помечены *