Рубрики
Без рубрики

Чтение и запись yaml в файл в node.js / javascript

ЯМЛ недавно стал довольно популярным в индустрии развития. В этой статье мы увидим, как вы можете использовать файлы YAML с приложением Node.js / JavaScript, чтение и запись им.

Автор оригинала: Scott Robinson.

Вступление

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

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

Существует несколько популярных библиотек узлов, используемых для анализа и генерации YAML: Ямл и JS-YAML Отказ JS-YAML Является ли более популярным из двух библиотек, поэтому мы будем сосредоточиться на этой статье.

Прежде чем мы движемся дальше, для этого учебника есть несколько предпосылок. У вас должно быть базовое понимание синтаксиса JavaScript, в частности, для выполнения Node.js. Вы также захотите иметь Node.js и NPM в вашей системе, чтобы следовать. Кроме того, учебник довольно прост и легко следовать для начинающих.

Монтаж

Как и в случае с любого пакета узла, установки довольно просты, используя NPM:

$ npm install js-yaml

Просто обязательно используйте правильные флаги для сохранения зависимости в вашем package.json file. Например, если JS-YAML используется только в целях развития, затем использовать --save-dev , в противном случае используйте --save Если он используется в производственной среде вашего приложения.

Вы можете убедиться, что он правильно установлен, открывая REFL из того же каталога и импортировать пакет со следующим:

$ 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' ] } ]

Еще один метод стоит упомянуть, это . Нажмите () Метод, который очень похож на .safeload () за исключением того, что он поддерживает Все Виды схемы YAML Отказ Дополнительные поддерживаемые типы специфичны для JavaScript ( !! JS/undefined , !! JS/Regexp и !! JS/Функция ), и вы должны абсолютно доверять данным в этих ямле Файлы, поскольку он может загрузить ненадежный код.

Например, функция может быть определена в 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, и наоборот. В некоторых случаях ближайший тип данных будет использоваться, когда это возможно, если он не поддерживается напрямую. Например, ямл !! Seq Тип будет проанализирован как массив JavaScript.

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

ноль !!ноль
правда бол !! bool.
3 номер !! int.
3.1415 номер !!плавать
c3rhy2thynvzzs5jb20 = буфер !! Двоичный
‘2013-08-15’ Дата !! timestamp
[…] Массив пар клавишных пар !! OMAP.
[…] Массив или пары массива !! пары
{…} Массив объектов с заданными ключами и нулевыми значениями !!набор
‘…’ нить !! ул
[…] множество !! Seq.
{…} объект !!карта

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

Заключение

ЯМЛ – все более популярное формат, используемый для структурирования данных для приложений, как правило, как файлы конфигурации, но и в качестве замены для всего, для чего JSON используется для. Из-за его высокой гибкости и легко читающей синтаксис, он быстро заменяет JSON во многих проектах, хотя оба все еще имеют свое место.

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