简介

云函数是运行在云端的 JavaScript 代码,和普通的Node.js开发一样,熟悉Node.js的开发者可以直接上手。

如下是将传入的两个参数求和并返回客户端的云函数代码示例:

  1. 'use strict';
  2. exports.main = async (event, context) => {
  3. //event为客户端上传的参数
  4. return {
  5. sum:event.a + event.b
  6. }
  7. }

云函数的传入参数有两个,一个是event对象,一个是context对象。event指的是触发云函数的事件,当客户端调用云函数时,event就是客户端调用云函数时传入的参数。context 对象包含了此处调用的调用信息和运行状态,可以用它来了解服务运行的情况。uniCloud会自动将客户端的操作系统(os)、运行平台(platform)、应用信息(appid)等注入context中,开发者可通过context获取每次调用的上下文,如下是一个示例:

  1. 'use strict';
  2. exports.main = async (event, context) => {
  3. //event为客户端上传的参数
  4. ...
  5. //context中可获取客户端调用的上下文
  6. let os = context.OS //客户端操作系统,返回值:android、ios 等
  7. let platform = context.PLATFORM //运行平台,返回值为 mp-weixin、app-plus等
  8. let appid = context.APPID // manifest.json中配置的appid
  9. ... //其它业务代码
  10. }

访问数据库

云函数中支持访问本服务空间下的数据库,调用方式详见规范

访问HTTP服务

uniCloud提供了uniCloud.httpclient供开发者使用。无需额外依赖,就可以请求任何 HTTP 和 HTTPS 协议的 Web 服务。uniCloud.httpclient返回的是一个urllib实例

uniCloud.httpclient.request(URL,requestOptions)

requestOptions参数说明

参数名类型是否必填默认值说明
methodString-GETHTTP 请求方法, 默认为:GET. 可选值: GET, POST, DELETE, PUT
dataObject--发送的数据
dataAsQueryStringBoolean-true是否强制转换data为queryString
contentString | Buffer--手动设置请求的payload,设置后会忽略data
filesArray<ReadStream|Buffer|String> | Object | ReadStream | Buffer | String--上传的文件,设置后将会使用 multipart/form-data 格式。如果未设置method,将会自动将method设置为POST
contentTypeString--上传数据的格式,设为json会自动在header内设置Content-Type: application/json
nestedQuerystringBoolean--转换data为queryString时默认不支持嵌套Object,此选项设置为true则支持转换嵌套Object
dataTypeString--返回的数据格式
headersObject--请求头
timeoutNumber | Array--超时时间设置。设置为数组时第一项为请求超时,第二项为返回超时。设置为数字时相当于同时设置请求超时和返回超时,即timeout:3000效果等于timeouut:[3000,3000]

示例代码

  1. const res = await uniCloud.httpclient.request(apiUrl, {
  2. method: 'POST',
  3. data: {
  4. test: 'testValue'
  5. },
  6. dataType: 'json'
  7. })
  8. console.log(res)

使用npm

在云函数中我们可以引入第三方依赖来帮助我们更快的开发。云函数的运行环境是 Node.js,因此我们可以使用 npm 安装第三方依赖。

注意:鉴于阿里云的限制,目前仅支持全量上传云函数(整个 node_modules文件夹全部上传),因此提醒大家,精简依赖,否则可能会每次上传时间很慢,影响开发体验。

Tips:

  • 目前每个云函数上传包大小限制为10M。

客户端调用云函数

前端代码(H5前端、App、小程序),不再执行uni.request联网,而是通过uniCloud.callFunction调用云函数,callFunction定义如下:

请求参数

字段类型必填说明
nameString云函数名称
dataObject客户端需要传递的参数

响应参数

字段类型说明
resultObject云函数执行结果
requestIdString请求序列号,用于错误排查

示例代码

  1. // promise方式
  2. uniCloud.callFunction({
  3. name: 'test',
  4. data: { a: 1 }
  5. })
  6. .then(res => {});
  7. // callback方式
  8. uniCloud.callFunction({
  9. name: 'test',
  10. data: { a: 1 },
  11. success(){},
  12. fail(){},
  13. complete(){}
  14. });

目前仅支持客户端调用云函数,即将支持云函数调用云函数。

注意事项

云函数是运行在云端的代码,运行环境由云服务器弹性调配,这是和传统Node.js应用很大的区别。

换言之,云函数每次执行的宿主环境(可简单理解为虚拟机或服务器硬件)可能相同,也可能不同,因此传统Node.js开发中将部分信息存储本地硬盘或内存的方案就不再适合,建议通过云数据库或云存储的方案替代。

另一方面,鉴于云函数的弹性调配机制,为提高运行性能,部分云厂商在一定时间周期内会复用相同的云函数实例,此时为避免数据污染,建议使用无状态的风格编写函数代码。

以如下代码为例,count作为全局变量,当多次调用该云函数时,可能会出现变量累加的情况(实例未复用时,每次返回0,若实例被复用,则可能返回1、2、3等各种意外情况)

云函数中使用的时区是 UTC+0,而不是 UTC+8,在云函数中使用时间时需特别注意。

  1. let count = 0;
  2. module.exports = async (event) => {
  3. return count++
  4. //此示例为错误示例
  5. //云函数实例未复用时,每次返回0
  6. //若实例被复用,则可能返回1、2、3等各种意外情况
  7. }

云函数中调用云函数

用法同客户端调用云函数,不支持callback形式

请求参数

字段类型必填说明
nameString云函数名称。
dataObject云函数参数。

响应参数

字段类型必备说明
errCodeString状态码,操作成功则不返回。
errMsgString错误描述。
resultObject云函数执行结果。
requestIdString请求序列号,用于错误排查。

示例代码

  1. let callFunctionResult = await uniCloud.callFunction({
  2. name: "test",
  3. data: { a: 1 }
  4. })

发现错误?想参与编辑?在 GitHub 上编辑此页面!