Поскольку я продолжаю свое путешествие по изучению безсерверных технологий и OpenWhisk, сегодня я собираюсь рассказать о другом способе развертывания вашего кода — сжатых действиях. Итак, что мы подразумеваем под заархивированными действиями?

Ранее я демонстрировал создание действий на основе отдельных файлов. Итак, действие Cat было основано на файле cat.js. Вы также можете создавать действия как последовательность других действий. Заархивированные действия — это в основном файлы JavaScript, упакованные в виде модуля npm. Почему вы хотите это сделать?

Во-первых, OpenWhisk предоставляет набор модулей npm, которые вы можете использовать в своем коде. И хотя последний вариант хорош, вам может понадобиться что-то не в этом списке. Создав свой собственный пакет кода, вы можете включить его в свое действие. Во-вторых, вы можете просто разбить свой код на несколько файлов. Процедура не особо сложная.

Предположим простое действие:

function main() {
    return { message: "Hello World"}
}

Сначала я добавляю в папку package.json. (Было бы проще, если бы ваш код для этого конкретного действия находился в отдельной папке.)

{
  "name": "something",
  "version": "1.0.0",
  "main": "main.js",
  "dependencies" : {
  }
}

Имя не имеет значения (хотя вы, вероятно, захотите выбрать что-то подходящее для вашего действия), но main должен указывать на JS-файл вашего действия, точку входа в это действие в целом.

Затем измените свое действие, чтобы экспортировать основную функцию:

function main() {
    return { message: "Hello World"}
}
exports.main = main;

Теперь вам нужно заархивировать файлы. Будьте очень, очень, очень осторожны на этом этапе. Заархивируйте не папку, а файлы в папке. Я использовал встроенную в Windows функцию «Отправить в сжатую папку» для самой папки, и это создало почтовый индекс, где первой записью была папка. Вы хотите заархивировать файлы, а не папку.

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

wsk action create packageAction --kind nodejs:6 action.zip

После этого вы можете запустить его как любое обычное действие. Обратите внимание, что распаковка вашего кода означает, что вам потребуется немного больше времени для запуска вашего действия, если оно холодное (причудливый способ сказать «давно не выполнялось»), но если вы уверены, что ваше действие будет довольно активным, тогда вы все должно быть в порядке.

Теперь рассмотрим реальный пример. В прошлом я использовал пакет npm под названием FeedParser как способ анализа RSS-каналов в Node.js. Я подумал, что было бы здорово создать действие, которое позволило бы мне указать URL-адрес RSS и получить JSON-анализ возвращаемых данных. Я начал с моего package.json:

{
  "name": "rsstojson",
  "version": "1.0.0",
  "main": "main.js",
  "dependencies" : {
    "feedparser" : "*",
    "request":"*"
  }
}

Затем я побежал:

npm install

Чтобы установить все эти зависимости. Далее я написал свое действие:

var FeedParser = require('feedparser');
var request = require('request');
function main(args) {
    return new Promise(function(resolve, reject) {
        var fp = new FeedParser();
        
        request.get(args.url).pipe(fp);
        var items = [];
        var meta;
        fp.on('readable', function() {
            var stream = this;
            var item;
            while(item = stream.read()) {
                if(!meta) meta = item.meta;
                delete item.meta;
                items.push(item);
            }
        });
        fp.on('end', function() {
            resolve({items:items, meta:meta});
        });
    });
}
exports.main = main;

Все, что я делаю, это беру аргумент URL, всасываю его через пакет Request, а затем передаю в FeedParser. Я заметил, что FeedParser создает «мета» объект для каждого элемента фида. Этот метаобъект включает в себя метаданные о самой ленте. Я подумал, что это полезно, но мне не понравилось, что это дублируется в каждом элементе фида. Поэтому я беру его из первого элемента и удаляю из каждого элемента, добавленного в массив результатов. Затем я могу вернуть список записей RSS и метаданные.

И это все! Вывод довольно подробный, поэтому я не буду делиться снимком экрана, но я включил видео на эту тему ниже.

Эта статья первоначально появилась в моем блоге: https://www.raymondcamden.com/2017/01/10/creating-packaged-actions-in-openwhisk