Если вы уже изучали 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!" } }