- 最新动态
- 功能总览
- 产品介绍
- 计费说明
- 快速入门
- 用户指南
-
最佳实践
- FunctionGraph最佳实践汇总
-
数据处理类实践
- 使用FunctionGraph函数对OBS中的图片进行压缩
- 使用FunctionGraph函数为OBS中的图片打水印
- 使用FunctionGraph函数对DIS数据进行格式转换并存储到CloudTable
- 使用FunctionGraph函数实现通过API方式上传文件
- 使用FunctionGraph函数对IoTDA中的设备坐标数据进行转换
- 使用FunctionGraph函数对OBS中的文件进行加解密
- 使用FunctionGraph函数识别LTS中的异常业务日志并存储到OBS
- 使用FunctionGraph函数对LTS中的日志进行实时过滤
- 使用FunctionGraph函数流对OBS中的图片进行旋转
- 使用FunctionGraph函数流对图片进行压缩和打水印
- 功能应用类实践
- 函数构建类实践
- 开发指南
- API参考
- SDK参考
- 场景代码示例
-
常见问题
-
产品咨询
- 使用FunctionGraph是否需要开通计算、存储、网络等服务?
- 使用FunctionGraph开发程序之后是否需要部署?
- FunctionGraph为函数分配的磁盘空间有多少?
- 是否支持在函数中启动TCP的监听端口,通过EIP接收外部发送过来的TCP请求?
- 函数发起HTTP请求的源地址如何获取?
- FunctionGraph是否支持对上传的zip文件进行反编译?
- FunctionGraph的函数是否支持功能扩展?
- FunctionGraph中的代码是如何隔离的?
- 函数常规信息中的“应用”如何理解?
- 用户需要为函数的冷启动时间付费吗?
- 函数计费中的调用次数,是某一账号下在不同region的所有函数的调用次数总和吗?
- Python语言的函数从V1版本迁移到V2版本时需注意哪些兼容性问题?
- FunctionGraph函数支持哪些编程语言?
- 创建函数
-
配置函数
- 能否在函数环境变量中存储敏感信息?
- FunctionGraph的函数如何读写上传的文件?
- 为函数挂载文件系统时,报“failed to mount exist system path”
- FunctionGraph如何实现域名解析?
- FunctionGraph如何通过域名访问专享版APIG中注册的接口?
- FunctionGraph函数通过域名访问APIG中注册的接口时,报域名无法解析?
- 使用定制运行时语言的函数能操作哪些目录?
- FunctionGraph的函数支持哪些中文字体?
- 能否在函数代码中使用线程和进程?
- 函数如何访问MySQL数据库?
- 函数无法通过VPC连接对应的Redis?
- 如何读取函数的请求头?
- Python语言的函数中,中文注释报乱码错误
-
调用函数
- FunctionGraph的函数执行需要多长时间?
- FunctionGraph的函数执行包含了哪些过程?
- FunctionGraph函数长时间不执行时,相关的实例会如何处理?
- 如何获取函数运行过程中的内存使用量信息?
- 为什么首次调用函数时速度会比较慢?
- 为什么函数实际使用内存大于预估内存,甚至触发内存溢出OOM?
- 函数执行失败返回“runtime memory limit exceeded”时,如何查看内存占用大小?
- 自定义镜像函数执行失败报“CrashLoopBackOff”
- 同步调用函数时,未收到调用响应的可能原因?
- 函数中os.system("command &")命令的执行日志未采集,应如何处理?
- 函数执行超时的可能原因有哪些?
- 使用APIG触发器调用一个返回String的FunctionGraph函数时,报500错误
- Python2.7在执行reload(sys)后无法通过print打印日志
- 运行函数时报错error while loading shared libraries时如何处理?
- 配置触发器
- 配置依赖包
-
产品咨询
- 视频帮助
- 文档下载
- 通用参考
链接复制成功!
开发事件函数
Node.js函数接口定义
Node.js 6.10函数接口定义
export.handler = function(event, context, callback)
- 入口函数名(handler):入口函数名称, 需和函数执行入口处用户自定义的入口函数名称一致。
- 执行事件(event):函数执行界面由用户输入的执行事件参数, 格式为JSON对象。
- 上下文环境(context):Runtime提供的函数执行上下文,其接口定义在SDK接口说明。
- 回调函数(callback):callback方法完整声明为callback(err, message),用户通过此方法可以返回err和message至前台结果显示页面。具体的err或message内容需要用户自己定义,如字符串。
Node.js 8.10、Node.js 10.16、Node.js 12.13、Node.js 14.18、Node.js 16.17、Node.js 18.15函数接口定义
Node.js 8.10、Node.js 10.16、Node.js 12.13、Node.js 14.18、Node.js 16.17、Node.js 18.15 Runtime除了兼容Node.js 6.10 Runtime函数的接口定义规范,还支持使用async的异步形式作为函数入口。通过return进行返回。
exports.handler = async (event, context, callback[可选]) => { return data;}
Node.js函数的函数执行入口参数格式为:[文件名].[函数名],请参考函数执行入口通过FunctionGraph控制台进行配置。例如创建函数时设置函数执行入口为index.handler,那么FunctionGraph会去加载index.js中定义的handler函数。

建议使用Node.js 12.13版本。
Node.js的initializer入口介绍
FunctionGraph目前支持以下Node.js运行环境:
- Node.js 6.10 (runtime = Node.js 6)
- Node.js 8.10 (runtime = Node.js 8)
- Nodejs 10.16(runtime = Node.js 10)
- Nodejs 12.13(runtime = Node.js 12)
- Node.js 14.18(runtime = Node.js 14)
- Node.js 16.17(runtime = Node.js 16)
- Node.js 18.15(runtime = Node.js 18)
Initializer入口格式为:[文件名].[initializer名]
示例:实现initializer接口时指定的Initializer入口为“index.initializer”,那么函数工作流服务会去加载index.js中定义的initializer函数。
在函数工作流服务中使用Node.js编写initializer逻辑,需要定义一个Node.js函数作为initializer入口,以下为initializer的简单示例。
exports.initializer = function(context, callback) { callback(null, ''); };
- 函数名
exports.initializer需要与实现initializer接口时的Initializer字段相对应。
示例:创建函数时指定的Initializer入口为index.initializer,那么FunctionGraph会去加载index.js中定义的initializer函数。
- context参数
context参数中包含一些函数的运行时信息。例如:request id、临时AccessKey、function meta等。
- callback参数
callback参数用于返回调用函数的结果,其签名是function(err, data),与Nodejs中惯用的callback一样,它的第一个参数是error,第二个参数data。如果调用时error不为空,则函数将返回HandledInitializationError,由于屏蔽了初始化函数的返回值,所以data中的数据是无效的,可以参考上文的示例设置为空。
SDK接口
Context类中提供了许多上下文方法供用户使用,其声明和功能如表1所示。
getToken()、getAccessKey()和getSecretKey()方法返回的内容包含敏感信息,请谨慎使用,避免造成用户敏感信息的泄露。
方法名 |
方法说明 |
---|---|
getRequestID() |
获取请求ID。 |
getRemainingTimeInMilliSeconds () |
获取函数剩余运行时间。 |
getAccessKey() |
获取用户委托的AccessKey(有效期24小时),使用该方法需要给函数配置委托。 当前函数工作流已停止维护Runtime SDK 中getAccessKey接口,您将无法使用getAccessKey获取临时AK。 |
getSecretKey() |
获取用户委托的SecretKey(有效期24小时),使用该方法需要给函数配置委托。 当前函数工作流已停止维护Runtime SDK 中getSecretKey接口,您将无法使用getSecretKey获取临时SK。 |
getSecurityAccessKey() |
获取用户委托的SecurityAccessKey(有效期24小时),使用该方法需要给函数配置委托。 |
getSecuritySecretKey() |
获取用户委托的SecuritySecretKey(有效期24小时),使用该方法需要给函数配置委托。 |
getSecurityToken() |
获取用户委托的SecurityToken(有效期24小时),使用该方法需要给函数配置委托。 |
getUserData(string key) |
通过key获取用户通过环境变量传入的值。 |
getFunctionName() |
获取函数名称。 |
getRunningTimeInSeconds () |
获取函数超时时间。 |
getVersion() |
获取函数的版本。 |
getMemorySize() |
分配的内存。 |
getCPUNumber() |
获取函数占用的CPU资源。 |
getPackage() |
获取函数组。 |
getToken() |
获取用户委托的token(有效期24小时),使用该方法需要给函数配置委托。 |
getLogger() |
获取context提供的logger方法,返回一个日志输出类,通过使用其info方法按“时间-请求ID-输出内容”的格式输出日志。 如调用info方法输出日志: logg = context.getLogger() logg.info("hello") |
getAlias |
获取函数的别名 |
开发Node.js函数
以下为本地开发后上传代码文件,也可以直接在页面创建在线编辑。
约束与限制:
- 本例函数工程文件保存在“~/Code/”文件夹下,在打包的时候务必进入Code文件夹下选中所有工程文件进行打包,这样做的目的:定义了FunctionGraph函数的index.js是程序执行入口,确保fss_examples_nodejs.zip解压后,index.js文件位于根目录。
- callback返回的第一个参数不为null,则认为函数执行失败,会返回定义在第二个参数的HTTP错误信息。
- 当使用APIG触发器时,函数返回必须使用示例中output的格式, 函数Body参数仅支持返回如下几种类型的值。相关约束条件请参考Base64解码和返回结构体的说明。
- null:函数返回的HTTP响应Body为空。
- []byte: 函数返回的HTTP响应Body内容为该字节数组内容。
- string:函数返回的HTTP响应Body内容为该字符串内容。
- 创建函数工程
- 创建函数代码(同步形式入口函数)
打开文本编辑器,编写函数,代码如下,文件命名为index.js,保存文件。如下为同步方式入口函数。
exports.handler = function (event, context, callback) { const error = null; const output = { 'statusCode': 200, 'headers': { 'Content-Type': 'application/json' }, 'isBase64Encoded': false, 'body': JSON.stringify(event), } callback(error, output); }
- 创建函数代码(异步形式的入口函数, 运行时 8.10 及以上支持)
exports.handler = async (event, context) => { const output = { 'statusCode': 200, 'headers': { 'Content-Type': 'application/json' }, 'isBase64Encoded': false, 'body': JSON.stringify(event), } return output; }
如果您的Node.js函数中包含异步任务,须使用Promise以确保该异步任务在当次调用执行,可以直接return声明的Promise,也可以await执行该Promise。 暂时不支持在函数响应请求后继续执行异步任务的能力。
exports.handler = async(event, context ) => { const output = { 'statusCode': 200, 'headers': { 'Content-Type': 'application/json' }, 'isBase64Encoded': false, 'body': JSON.stringify(event), } const promise = new Promise((resolve, reject) => { setTimeout(() => { resolve(output) }, 2000) }) return promise // anthor way // res = await promise; // return res }
如果期望函数先响应,随后继续执行任务。 可以通过SDK/API调用FunctionGraph的异步执行函数接口实现。如果使用APIG触发器,可以单击生成的APIG触发器名称,跳转到APIG服务页面,选择Asynchronous方式调用。
- 创建函数代码(同步形式入口函数)
- 工程打包
下列示例中,使用异步形式入口作为演示。函数工程创建以后,可以得到以下目录,选中工程所有文件,打包命名为“fss_examples_nodejs.zip”。
图1 打包 - 创建FunctionGraph函数,上传程序包
登录FunctionGraph控制台,创建Node.js函数,上传fss_examples_nodejs.zip文件。如图2所示。
函数设置中,函数执行入口中的index与步骤创建函数工程中创建的函数文件名保持一致,通过该名称找到FunctionGraph函数所在文件。
函数执行入口中的handler为函数名,与步骤创建函数工程中创建的index.js文件中的函数名保持一致。
在函数工作流控制台左侧导航栏选择“函数 > 函数列表”,单击需要设置的“函数名称”进入函数详情页,选择“设置 > 常规设置”,配置“函数执行入口”参数,如图3所示。其中参数值为“index.handler”格式,“index”和“handler”支持自定义命名。
- 测试函数
- 创建测试事件。
在函数详情页,单击“配置测试事件”,弹出“配置测试事件”页,输入测试信息如图4所示,单击“创建”。
- 在函数详情页,选择已配置测试事件,单击“测试”。
- 创建测试事件。
- 函数执行
函数执行结果分为三部分,分别为函数返回(由callback返回)、执行摘要、日志输出(由console.log或getLogger()方法获取的日志方法输出),如图5所示。
执行结果
执行结果由3部分组成:函数返回、执行摘要和日志。
参数项 |
执行成功 |
执行失败 |
---|---|---|
函数返回 |
返回函数中定义的返回信息。 |
返回包含错误信息和错误类型的JSON文件。格式如下: { "errorMessage": "", "errorType":"", } errorMessage:Runtime返回的错误信息 errorType:错误类型 |
执行摘要 |
显示请求ID、配置内存、执行时长、实际使用内存和收费时长。 |
显示请求ID、配置内存、执行时长、实际使用内存和收费时长。 |
日志 |
打印函数日志,最多显示4KB的日志。 |
打印报错信息,最多显示4KB的日志。 |