tencent cloud

云函数

动态与公告
产品动态
产品公告
新手指引
产品简介
产品概述
相关概念
工作原理
产品优势
应用场景
相关产品
购买指南
计费概述
计费方式
计费项与计费方式
函数算力支持
免费额度
产品定价
计费示例
欠费与停服说明
快速入门
使用控制台创建一个事件函数
操作指南
配额管理
函数管理
Web 函数管理
日志管理
并发管理
触发器管理
函数 URL
自定义域名
版本管理
别名管理
权限管理
运行实例管理
插件管理
监控与告警管理
网络配置
层管理
执行配置
扩展存储管理
DNS 缓存配置
资源托管模式管理
近离线资源托管模式
工作流
触发器
触发器概述
触发器事件消息结构汇总
API 网关触发器
COS 触发器
CLS 触发器
定时触发器
CKafka 触发器
Apache Kafka 触发器
MQTT 触发器
触发器配置描述
MPS 触发器
CLB 触发器说明
云 API 触发器
开发指南
基本概念
测试云函数
环境变量
依赖安装
使用容器镜像
使用 Docker 安装依赖
错误类型与重试策略
死信队列
云函数接入数据库
自动化部署
云函数状态码
常见错误码解决方法
开发者工具
Serverless Web IDE
函数间调用 SDK
第三方工具
代码开发
Python
Node.js
Golang
PHP
Java
Custom Runtime
使用镜像部署函数
Web 框架部署
通过命令行完成框架部署
快速部署 Egg 框架
快速部署 Express 框架
快速部署 Flask 框架
快速部署 Koa 框架
快速部署 Laravel 框架
快速部署 Nestjs 框架
快速部署 Nextjs 框架
快速部署 Nuxtjs 框架
快速部署 Django 框架
实践教程
最佳实践概述
云产品联合解决方案
业务开发相关实践
实时音视频 TRTC
对象存储 COS
消息队列 CKafka
日志服务CLS
负载均衡 CLB
视频处理 MPS
内容分发网络 CDN
云数据仓库 PostgreSQL
云点播 VOD
短信 SMS
Elasticsearch Service
定时任务
视频处理
客户案例
腾讯在线教育
在线教育行业案例
游戏聊天系统
腾讯互娱国际(IEGG)
API 文档
History
Introduction
API Category
Making API Requests
Other APIs
Namespace APIs
Layer Management APIs
Async Event Management APIs
Trigger APIs
Function APIs
函数和层的状态说明
Data Types
Error Codes
SDK文档
常见问题
通用问题
Web 函数相关问题
计费相关问题
网络相关问题
日志相关问题
SCF 工具相关问题
事件处理相关问题
API 网关触发器相关问题
相关协议
Service Level Agreement
联系我们
词汇表

开发方法

PDF
聚焦模式
字号
最后更新时间: 2024-04-22 18:03:28

函数形态

Node.js 函数形态一般有以下两种:
示例 1:
exports.main_handler = async (event, context) => {
console.log(event);
console.log(context);
return event
};
示例 2:
exports.main_handler = (event,context,callback)=>{
console.log(event);
console.log(context);
callback(null,"hello world");
}

执行方法

在创建云函数 SCF 时,均需要指定执行方法。在使用 Node.js 开发语言时,执行方法类似 index.main_handler,此处 index 表示执行的入口文件为 index.jsmain_handler 表示执行的入口函数为 main_handler 函数。在使用本地 zip 文件上传、COS 上传等方法提交代码 zip 包时,请确认 zip 包的根目录下包含有指定的入口文件,文件内有定义指定的入口函数,文件名和函数名和执行方法处填写的能够对应,避免因为无法查找到入口文件和入口函数导致的执行失败。

入参

Node.js 环境下的入参包括 event、context 和 callback,其中 callback 为可选参数。
event:使用此参数传递触发事件数据。
context:使用此参数向您的处理程序传递运行时信息。
callback(可选)callback 是一个函数,可以在非异步处理程序中使用它来返回响应。响应对象必须与 JSON.stringify 兼容。callback 函数有 Error和响应两个参数,调用该函数时,SCF 等待函数执行完成后将响应或错误返回。

返回和异常

异步处理程序

异步处理程序必须使用 async 关键字,使用 return 来返回响应,使用 throw 返回错误信息。
在 SCF 中,如果您的 Node.js 函数中包含异步任务,须返回一个 promise 以确保该异步任务在当次调用执行。当您完成或拒绝该 promise 时,SCF 会返回响应或错误信息。
注意:
promise 方法不支持用 callback 方法返回,请使用 return。
异步处理程序示例:
exports.main_handler = async(event,context,callback) => {
const promise = new Promise((resolve,reject) => {
setTimeout(function() {
resolve('成功')
// reject('失败')
}, 2000)
})
return promise
};

非异步处理程序

非异步处理程序,函数会一直执行,直到函数执行完成或函数超时后,SCF 将响应或错误信息返回。
注意:
由于部分外部引入的库的原因,可能会导致事件循环持续不为空,从而导致函数无法返回直到超时。为了避免外部库的影响,可以通过关闭事件循环等待来自行控制函数的返回时机。通过设置 context.callbackWaitsForEmptyEventLoop 为 false,可以修改默认的回调行为,避免等待事件循环为空。
您可以在 callback 回调执行前设置 context.callbackWaitsForEmptyEventLoop = false;,使云函数后台在 callback 回调被调用后立刻冻结进程,不再等待事件循环内的事件,而在同步过程完成后立刻返回。
非异步处理程序示例:
exports.main_handler = (event, context,callback) => {
context.callbackWaitsForEmptyEventLoop = false
callback(null,'success')
setTimeout(() => {
console.log('finish')
},5000);
};

异步特性支持

Node.js 10.15 及以上 的 runtime 中,我们支持了将函数的同步执行返回和异步事件处理分开进行的能力。
入口函数的同步执行过程完成及返回后,云函数的调用将立刻返回,并将代码的返回信息返回给函数调用方。
同步流程处理并返回后,代码中的异步逻辑可以继续执行和处理,直到异步事件执行完成后,云函数的实际执行过程才完成和退出。
注意:
在这个过程中,由于云函数的日志是在整个执行过程完成后才进行收集和处理,因此在同步执行过程完成并返回时,云函数的返回信息中暂时无法提供日志、运行信息包括耗时、内存消耗等内容。具体信息可以在函数实际执行过程完成后,通过 Request Id 在日志中查询。
云函数的运行时长,将按照异步事件执行完成后进行计算。如果异步事件队列一直无法清空或执行完成,将会导致函数超时。这种情况下,调用方可能已经获得了函数的正确响应结果,但是云函数的运行状态将标注为由于超时而失败,同时运行时长按超时时间统计。
Node.js 的同步和异步运行特性、返回时间及运行时长示例如下图所示:
node10.15feature



异步特性示例

使用如下示例代码创建函数,其中使用 setTimeout 方法设置了一个2秒后执行的函数:
'use strict';
exports.main_handler = (event, context, callback) => {
console.log("Hello World")
console.log(event)
setTimeout(timeoutfunc, 2000, 'data');
callback(null, event);
};

function timeoutfunc(arg) {
console.log(`arg => ${arg}`);
}
在保存代码后,通过控制台测试或者通过云 API 的 Invoke 接口调用此函数,可以看到此函数在很短时间内即返回,响应时间小于1秒。 而查看函数的执行日志时,可以看到相关统计信息类似如下:
START RequestId: 1d71ddf8-5022-4461-84b7-e3a152403ffc
Event RequestId: 1d71ddf8-5022-4461-84b7-e3a152403ffc
2020-03-18T09:16:13.440Z 1d71ddf8-5022-4461-84b7-e3a152403ffc Hello World
2020-03-18T09:16:13.440Z 1d71ddf8-5022-4461-84b7-e3a152403ffc { key1: 'test value 1', key2: 'test value 2' }
2020-03-18T09:16:15.443Z 1d71ddf8-5022-4461-84b7-e3a152403ffc arg => data
END RequestId: 1d71ddf8-5022-4461-84b7-e3a152403ffc
Report RequestId: 1d71ddf8-5022-4461-84b7-e3a152403ffc Duration:2005ms Memory:128MB MemUsage:13.425781MB
在日志中统计了2005ms的执行时间,同时日志中可以看到在2秒后输出了 arg => data 的内容,即相关异步操作在当前调用中执行且是在同步过程执行完成后执行的,而函数调用在异步任务执行完成后才结束。

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈