首页
/ OpenWhisk 中 JavaScript 动作的创建与使用指南

OpenWhisk 中 JavaScript 动作的创建与使用指南

2025-07-07 05:53:19作者:殷蕙予

前言

OpenWhisk 是一个强大的无服务器计算平台,允许开发者以函数即服务(FaaS)的方式运行代码。本文将详细介绍如何在 OpenWhisk 中创建和使用 JavaScript 动作,涵盖从基础到高级的各种用法。

基础 JavaScript 动作

创建简单动作

  1. 创建一个名为 hello.js 的文件,内容如下:
function main() {
    return { msg: 'Hello world' };
}

这个简单的动作返回一个包含问候信息的 JSON 对象。

  1. 使用以下命令创建动作:
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 来实现:

  1. 创建 asyncAction.js 文件:
function main(args) {
     return new Promise(function(resolve, reject) {
       setTimeout(function() {
         resolve({ done: true });
       }, 2000);
    })
 }
  1. 创建并调用动作:
wsk action create asyncAction asyncAction.js
wsk action invoke --result asyncAction
  1. 查看激活日志了解执行时间:
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 文件部署:

  1. 创建 package.json
{
  "name": "my-action",
  "main": "index.js",
  "dependencies": {
    "left-pad": "1.1.3"
  }
}
  1. 创建 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;
  1. 安装依赖并打包:
npm install
zip -r action.zip *
  1. 创建动作:
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

方法二:构建自定义运行时镜像

  1. 创建 Dockerfile:
FROM openwhisk/action-nodejs-v10
RUN npm install <LIB_WITH_NATIVE_DEPS>
  1. 构建并推送镜像:
docker build -t <USERNAME>/custom-runtime .
docker push <USERNAME>/custom-runtime
  1. 创建动作:
wsk action create my-action --docker <USERNAME>/custom-runtime action.zip

使用 JavaScript 打包工具

使用 rollup.js

  1. 修改 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
  1. 配置并运行 rollup:
npx rollup --config
  1. 创建动作:
wsk action create my-action bundle.js --kind nodejs:20

使用 webpack

  1. 修改 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
  1. 运行 webpack:
npx webpack --config webpack.config.js

使用 parcel

  1. 修改 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
  1. 运行 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 动作。