Если вы уже изучали OpenWhisk и строили свою бессерверную инфраструктуру, вам стоит обратить внимание на некоторые недавние изменения при создании действий OpenWhisk.

Некоторые функции API Node.js устарели - многие из этих изменений являются критическими, а это означает, что если вы их не исправите, ваши действия OpenWhisk перестанут работать.

Изменения API среды выполнения Node.js

Внутри действий Node.js глобальный объект whisk и все его методы устарели. Это включает в себя:

whisk.invoke, whisk.trigger, whisk.error, whisk.done, whisk.async, whisk.setAuthKey, whisk.getAuthKey

Что это значит для вас?

Во-первых, вам необходимо потребовать пакет OpenWhisk npm и создать экземпляр openwhisk, прежде чем вы сможете его использовать:

var openwhisk = require('openwhisk’);
function main(params) {
var wsk = openwhisk()
  //do stuff
}

Вызов действий и триггеров

Если вы вызывали действия с помощью whisk.invoke, теперь вам нужно использовать action.invoke() метод модуля OpenWhisk npm. Например:

function main(params) {
  var wsk = openwhisk()
  return wsk.actions.invoke({
    actionName: “myAction",
    params: { myParam: "the value" }
  });
}

Если вы запускали триггеры с помощью whisk.trigger, you need to now use the OpenWhisk npm module’s trigger.invoke() method.

function main(params) {
  var wsk = openwhisk()
  return wsk.triggers.invoke({
    triggerName: “myTrigger”
  });
}

Переменные среды

Методы whisk.getAuthKey и whisk.setAuthKey больше не существуют. Теперь вы можете получить доступ к хосту API, пространству имен и значениям ключей API в качестве переменных среды.

Пример (из helloContext.js):

function main(args) {
  return {
    "api_host": process.env['__OW_API_HOST'],
    "api_key": process.env['__OW_API_KEY'],
    "namespace": process.env['__OW_NAMESPACE'],
    "action_name": process.env['__OW_ACTION_NAME'],
    "activation_id": process.env['__OW_ACTIVATION_ID'],
    "deadline": process.env['__OW_DEADLINE']
  }
}

Асинхронные изменения действий

Поведение и реализация асинхронных действий JavaScript также изменились. Это изменение влияет на любые действия, которые могли использовать whisk.async вместе с whisk.done и whisk.error.

Раньше вы могли написать асинхронное действие, возвращая whisk.async из main, а затем использовать whisk.done или whisk.error, чтобы сигнализировать о завершении (или ошибке) асинхронной операции. Что-то вроде этого:

function main() {
  setTimeout(function() {
    if (error) {
      return whisk.error();
    } else {
      return whisk.done({done: true});
    }
  }, 2000);
  return whisk.async();
}

В последних действиях Node.js v6 теперь вы должны использовать обещания. Внутри обещания вы будете использовать метод resolve или reject для выполнения асинхронного действия обещания.

Что-то вроде этого:

function main(args) {
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      if (error) {
        reject(error);
      } else {
        resolve({ done: true });
      }
    }, 2000);
  })
}

Вы можете проверить документацию OpenWhisk, чтобы узнать больше о создании асинхронных действий, или проверить асинхронный пример здесь.

Синхронные действия остаются прежними ... Вы можете вернуть значение из main вместо возврата Promise. Например:

function main(args) {
  return {
    payload:”Hello World!"
  }
}