OpenWhisk 中 JavaScript 动作的创建与使用指南
2025-07-07 05:53:19作者:殷蕙予
前言
OpenWhisk 是一个强大的无服务器计算平台,允许开发者以函数即服务(FaaS)的方式运行代码。本文将详细介绍如何在 OpenWhisk 中创建和使用 JavaScript 动作,涵盖从基础到高级的各种用法。
基础 JavaScript 动作
创建简单动作
- 创建一个名为
hello.js
的文件,内容如下:
function main() {
return { msg: 'Hello world' };
}
这个简单的动作返回一个包含问候信息的 JSON 对象。
- 使用以下命令创建动作:
wsk action create hello hello.js
CLI 会根据源文件扩展名自动推断动作类型,对于 .js
文件默认使用 Node.js 运行时。
支持多种返回值
JavaScript 动作不仅可以返回 JSON 对象,还可以返回 JSON 数组:
function main(params) {
return ["a", "b"];
}
处理输入参数
以下示例展示如何处理输入参数:
/**
* 对一组字符串进行排序
* @param lines 要排序的字符串数组
*/
function main(msg) {
var lines = msg || [];
lines.sort();
return lines;
}
异步动作处理
JavaScript 异步函数可以通过返回 Promise 来实现:
- 创建
asyncAction.js
文件:
function main(args) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve({ done: true });
}, 2000);
})
}
- 创建并调用动作:
wsk action create asyncAction asyncAction.js
wsk action invoke --result asyncAction
- 查看激活日志了解执行时间:
wsk activation list --limit 1 asyncAction
wsk activation get <activation_id>
调用外部 API
以下示例展示如何调用 Yahoo Weather API:
var request = require('request');
function main(params) {
var location = params.location || 'Vermont';
var url = 'https://query.yahooapis.com/v1/public/yql?q=select item.condition from weather.forecast where woeid in (select woeid from geo.places(1) where text="' + location + '")&format=json';
return new Promise(function(resolve, reject) {
request.get(url, function(error, response, body) {
if (error) {
reject(error);
}
else {
var condition = JSON.parse(body).query.results.channel.item.condition;
var text = condition.text;
var temperature = condition.temp;
var output = 'It is ' + temperature + ' degrees in ' + location + ' and ' + text;
resolve({msg: output});
}
});
});
}
打包 Node.js 模块
可以将多个 JavaScript 文件和 NPM 库打包为 zip 文件部署:
- 创建
package.json
:
{
"name": "my-action",
"main": "index.js",
"dependencies": {
"left-pad": "1.1.3"
}
}
- 创建
index.js
:
function myAction(args) {
const leftPad = require("left-pad")
const lines = args.lines || [];
return { padded: lines.map(l => leftPad(l, 30, ".")) }
}
exports.main = myAction;
- 安装依赖并打包:
npm install
zip -r action.zip *
- 创建动作:
wsk action create packageAction --kind nodejs:20 action.zip
处理原生依赖
对于包含原生依赖的 NPM 库,有两种处理方法:
方法一:在运行时容器中安装
docker run -it -v $PWD:/nodejsAction openwhisk/action-nodejs-v10 "npm install"
zip -r action.zip *
wsk action create my-action --kind nodejs:20 action.zip
方法二:构建自定义运行时镜像
- 创建 Dockerfile:
FROM openwhisk/action-nodejs-v10
RUN npm install <LIB_WITH_NATIVE_DEPS>
- 构建并推送镜像:
docker build -t <USERNAME>/custom-runtime .
docker push <USERNAME>/custom-runtime
- 创建动作:
wsk action create my-action --docker <USERNAME>/custom-runtime action.zip
使用 JavaScript 打包工具
使用 rollup.js
- 修改
index.js
使用 ES6 模块:
import leftPad from 'left-pad';
function myAction(args) {
const lines = args.lines || [];
return { padded: lines.map(l => leftPad(l, 30, ".")) }
}
export const main = myAction
- 配置并运行 rollup:
npx rollup --config
- 创建动作:
wsk action create my-action bundle.js --kind nodejs:20
使用 webpack
- 修改
index.js
:
const leftPad = require('left-pad');
function myAction(args) {
const lines = args.lines || [];
return { padded: lines.map(l => leftPad(l, 30, ".")) }
}
global.main = myAction
- 运行 webpack:
npx webpack --config webpack.config.js
使用 parcel
- 修改
index.js
:
const leftPad = require('left-pad');
function myAction(args) {
const lines = args.lines || [];
return { padded: lines.map(l => leftPad(l, 30, ".")) }
}
global.main = myAction
- 运行 parcel:
npx parcel index.js
运行时环境参考
OpenWhisk 支持 Node.js 18 和 20 环境:
Node.js 18 环境
使用 --kind nodejs:18
指定,包含以下预装包:
- openwhisk - OpenWhisk平台的JavaScript客户端库
Node.js 20 环境
使用 --kind nodejs:20
指定,包含以下预装包:
- openwhisk - OpenWhisk平台的JavaScript客户端库
通过本文介绍的各种方法,开发者可以根据需求选择最适合的方式来创建和部署 OpenWhisk JavaScript 动作。