Updates to OpenWhisk Node.js actions
If you’ve already been exploring OpenWhisk and building your serverless infrastructure, you’ll want to pay attention to some recent changes when building your OpenWhisk actions.
Several Node.js API features have been deprecated — many of these changes are breaking changes, meaning, that if you do not address them, your OpenWhisk actions will cease to function.
Node.js Runtime API Changes
Inside of Node.js actions, the global whisk
object, and all of its methods have been deprecated. This includes:
whisk.invoke, whisk.trigger, whisk.error, whisk.done, whisk.async, whisk.setAuthKey, whisk.getAuthKey
What does that mean for you?
First, you need to require the OpenWhisk npm package and instantiate the openwhisk instance before you can use it:
var openwhisk = require('openwhisk’);function main(params) {
var wsk = openwhisk()
//do stuff
}
Invoking Actions and Triggers
If you were invoking actions using whisk.invoke
, you need to now use the OpenWhisk npm module’s action.invoke()
method. For example:
function main(params) {
var wsk = openwhisk()
return wsk.actions.invoke({
actionName: “myAction",
params: { myParam: "the value" }
});
}
If you were firing triggers using 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”
});
}
Environment Variables
The whisk.getAuthKey
and whisk.setAuthKey
methods no longer exist. You can now access the API host, namespace and API key values as environment variables.
Example (from 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']
}
}
Asynchronous Action Changes
The behavior and implementation of asynchronous JavaScript actions has also changed. This change affects any actions which may have used whisk.async
in conjunction with whisk.done
and whisk.error
.
Previously, you may have written an asynchronous action by returning whisk.async
from main
, and then use whisk.done
or whisk.error
to signal completion (or error) of the asynchronous operation. Something like this:
function main() {
setTimeout(function() {
if (error) {
return whisk.error();
} else {
return whisk.done({done: true});
}
}, 2000);
return whisk.async();
}
In the latest Node.js v6 actions, you should now use promises. Inside of the promise you will use either the resolve
or reject
method to complete the asynchronous action of the promise.
Something more like this:
function main(args) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
if (error) {
reject(error);
} else {
resolve({ done: true });
}
}, 2000);
})
}
You can check out the OpenWhisk docs to learn more about creating asynchronous actions, or check out an asynchronous sample here.
Synchronous actions remain the same… You can return a value from main, instead of returning a Promise. For example:
function main(args) {
return {
payload:”Hello World!"
}
}