全部产品
阿里云办公

事件处理函数

更新时间:2018-04-23 17:31:41

在创建函数时,您需要创建一个事件处理函数(event handler function),并指定对象 eventcontextcallbackevent 对象是调用函数时传入的数据,context 确定函数运行时您的个人信息和其他信息,callback 通知我们终止运行函数并返回信息给调用方。

事件处理函数示例

以一段构造 ossclient 实现访问OSS的事件处理函数为例,函数中的 handler 是函数计算调用的函数名称。假设您将此段代码保存为module.exports.handler.js。那么 module.exports.handler 就是事件处理函数。更多信息,请参阅 创建函数

  1. 'use strict';
  2. var oss = require('ali-oss').Wrapper;
  3. module.exports.handler = function(event, context, callback) {
  4. // 假设调用函数时,传入的event先被转化成一个JSON字符串
  5. // console.log再将一些传入的事件数据记录到阿里云日志服务中
  6. console.log('Received event:', event.toString());
  7. // 创建ossclient
  8. var ossclient = new oss ({
  9. // 从context中抓取您的AccessKeyID、AccessKeySecret、STS凭证以及OSS资源所在的地域
  10. accessKeyId: context.credentials.accessKeyId,
  11. accessKeySecret: context.credentials.accessKeySecret,
  12. stsToken: context.credentials.securityToken,
  13. region: 'oss-' + context.region,
  14. bucket: 'cici-test', // 此处为您的OSS Bucket
  15. });
  16. ossclient.get('test.txt'). then(function(res) {
  17. console.log('res', res.content.toString())
  18. // 调用callback时,函数停止运行
  19. // callback第一个参数是Error类型,null表示函数成功执行
  20. callback(null, res.content.toString())
  21. }).catch(function(err) {
  22. callback(err);
  23. });
  24. };

event 对象格式说明

event 对象相当于运行函数时的输入参数,是调用函数时传入的数据。例如,您调用一次函数(InvokeFunction)时,请求参数 Body 会被透传给事件处理函数,并且不严格要求 event 对象的格式。您可以根据业务需求选择不同的格式,如 JSON、XML、TXT、图像或者视频等,完全由您控制事件处理函数如何解析和使用 event 对象。

不同运行时(runtime)的 event 对象数据类型不同。更多详情,请参阅 Nodejs runtimePython runtimeJava runtime

说明:Java runtime不以 event 形式表示输入参数。在实现 StreamRequestHandler 接口时,inputStream 参数是调用函数时的输入参数,在实现 PojoRequestHandler<I, O> 接口时,通过泛型的方式表示输入参数,您需要自定义输入和输出的参数类型。更多详情,请参阅 Java runtime

假设您使用了OSS触发器,以下为一段JSON格式 event 示例:

  1. {
  2. "events": [
  3. {
  4. "eventName": "ObjectCreated:PutObject",
  5. "eventSource": "acs:oss",
  6. "eventTime": "2017-04-21T12:46:37.000Z",
  7. "eventVersion": "1.0",
  8. "oss": {
  9. "bucket": {
  10. "arn": "acs:oss:cn-shanghai:123456789:bucketname",
  11. "name": "testbucket",
  12. "ownerIdentity": "123456789",
  13. "virtualBucket": ""
  14. },
  15. "object": {
  16. "deltaSize": 122539,
  17. "eTag": "688A7BF4F233DC9C88A80BF985AB7329",
  18. "key": "image/a.jpg",
  19. "size": 122539
  20. },
  21. "ossSchemaVersion": "1.0",
  22. "ruleId": "9adac8e253828f4f7c0466d941fa3db81161e853"
  23. },
  24. "region": "cn-shanghai",
  25. "requestParameters": {
  26. "sourceIPAddress": "140.205.128.221"
  27. },
  28. "responseElements": {
  29. "requestId": "58F9FF2D3DF792092E12044C"
  30. },
  31. "userIdentity": {
  32. "principalId": "123456789"
  33. }
  34. }
  35. ]
  36. }

context 对象格式说明

context 存储了函数运行时您的个人信息和其他信息。包括请求ID、AccessKeyID、AccessKeySecret、SecurityToken、地域、服务(Service)和函数(Function)信息。通过使用 context,您可以:

  • 获得本次请求ID,并记录到函数运行日志中。后续通过该请求ID追踪详细信息。

  • 直接调用您的AccessKey信息等鉴权信息。通过AccessKey访问其他阿里云服务,如对象存储OSS,表格存储或者API网关等,避免将AccessKey信息写在代码里。

  • 获取服务及函数的基本信息。

不同运行时(runtime)的 context 对象格式不同。更多详情,请参阅 Nodejs runtimePython runtimeJava runtimecontext 的大概格式如下所示:

  1. {
  2. requestId: '886a2272-346f-c9ad-9db0-0dc0f35cb5b5',
  3. credentials: {
  4. accessKeyId: 'STS.abcdefghijklmn',
  5. accessKeySecret: 'abcdefghijklmnopqrstuvwxyz',
  6. securityToken: 'CAISh+********'
  7. },
  8. function: {
  9. name: 'tt',
  10. handler: 'index.handler',
  11. memory: 512,
  12. timeout: 60
  13. },
  14. service: {
  15. name: 'test',
  16. logProject: 'test-log-project',
  17. logStore: 'test-log-store'
  18. },
  19. region: 'cn-shanghai',
  20. accountId: '167*************'
  21. }

callback 对象格式说明

调用 callback 后,我们会终止运行函数并返回信息给调用方。您必须主动调用 callback 函数,通知我们函数执行完毕,否则会出现超时错误。以下为 callback 的一些使用示例:

  1. callback(Error error, Object result)
  2. //可选参数 error 通知系统函数执行失败并将错误信息返回给调用方
  3. //可选参数 result 返回函数成功信息给调用方。使用了 error 时,result 会被忽略
  4. callback();
  5. // 表明函数执行成功,无返回信息
  6. callback(null);
  7. // 表明函数执行成功,无返回信息
  8. callback(null, null);
  9. // 表明函数执行成功,无返回信息
  10. callback(null, "success");
  11. // 表明函数执行成功,返回“success”信息给调用方
  12. callback(new Error("error"));
  13. // 表明函数执行失败,返回“error”信息给调用方
  14. callback(new Error("error"), "ignored message")
  15. // 表明函数执行失败,第二个参数被忽略
  16. callback("error");
  17. // 表明函数执行失败

使用 error 参数返回错误信息时,我们将错误信息自动记录到与该函数关联的日志服务日志库中。我们只记录 error 信息小于等于256 KB的部分,超过256 KB时在错误消息后显示 Truncated by FunctionCompute

对于同步调用类型的函数,错误消息或者结果数据会填充到HTTP Header中,并返回给调用方。对于异步调用类型的函数,不会返回错误信息或者结果数据。

相关链接

  • 更多关于 event 示例,请参阅 云栖社区 函数计算入口参数event详解
  • 什么是OSS
  • 什么是日志服务
  • 什么是表格存储
  • 什么是API网关