编写普通云函数
基础代码示例
以下是一个简单的 Node.js 云函数示例,展示如何处理入参并返回结果:
// index.js - 云函数入口文件
exports.main = async (event, context) => {
// 1. 解析云函数入参
const { a, b } = event;
// 2. 执行业务逻辑
const sum = a + b;
// 3. 返回结果
return {
sum,
timestamp: Date.now(),
requestId: context.requestId,
};
};
异步处理实践
由于实例的管理由平台自动处理,推荐云函数采用 async/await 模式,避免使用 Promise 链式调用:
exports.main = async (event, context) => {
// ❌ 不推荐:Promise 链式调用
getList().then((res) => {
// do something...
});
// ✅ 推荐:使用 async/await
const res = await getList();
// do something...
};
函数 入参详解
每个云函数调用都会收到两个重要对象:event 和 context。
event 对象
event 对象包含触发云函数的事件数据,其内容根据触发方式不同而变化:
- 小程序调用:包含小程序端传入的参数
- HTTP 请求调用:包含 HTTP 请求信息(如请求头、请求体等)
- 定时触发:包含定时触发的相关信息
context 对象
context 对象提供调用上下文信息,帮助您了解函数的运行环境和调用方式:
- 请求 ID:当前调用的唯一标识符
- 调用来源:触发函数的服务或客户端信息
- 执行环境:函数的运行时信息
- 用户身份:调用方的身份信息(如有)
函数返回值
云函数支持两种响应方式:简单响应和集成响应。系统会根据返回值的格式自动识别响应类型。
简单响应
直接返回数据,系统自动生成标准的 HTTP 响应。
- 返回字符串
- 返回 JSON
exports.main = async () => {
return "Hello CloudBase";
};
HTTP 响应:
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Hello CloudBase
exports.main = async () => {
return {
success: true,
data: { id: 123, name: "CloudBase" },
timestamp: Date.now()
};
};
HTTP 响应:
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
{"success":true,"data":{"id":123,"name":"CloudBase"},"timestamp":1699999999999}
集成响应(高级)
当需要精确控制 HTTP 状态码、响应头等信息时,使用集成响应格式:
{
statusCode: number, // HTTP 状态码(必填)
headers: { // HTTP 响应头(可选)
"headerName": "headerValue"
},
body: string, // 响应体内容(可选)
isBase64Encoded: boolean // body 是否为 Base64 编码(可选)
}
💡 识别规则:返回值包含
statusCode字段时,系统会识别为集成响应。
集成响应示例
- 返回 HTML 页面
- 页面重定向
- 返回图片
- 错误响应
- 返回 JavaScript
exports.main = async () => {
return {
statusCode: 200,
headers: {
"Content-Type": "text/html; charset=utf-8"
},
body: `
<!DOCTYPE html>
<html>
<head><title>CloudBase</title></head>
<body>
<h1>欢迎使用云开发</h1>
<p>这是通过云函数返回的 HTML 页面</p>
</body>
</html>
`
};
};
浏览器访问时会直接渲染该 HTML 页面。
exports.main = async (event) => {
const { path } = event;
return {
statusCode: 302,
headers: {
"Location": `https://docs.cloudbase.net${path}`
}
};
};
访问云函数时会自动跳转到指定 URL。
const fs = require('fs');
const path = require('path');
exports.main = async () => {
// 读取图片文件并转换为 Base64
const imagePath = path.join(__dirname, 'image.png');
const imageBuffer = fs.readFileSync(imagePath);
const base64Image = imageBuffer.toString('base64');
return {
statusCode: 200,
headers: {
"Content-Type": "image/png"
},
body: base64Image,
isBase64Encoded: true
};
};
⚠️ 注意:二进制文件(图片、音视频等)必须设置
isBase64Encoded: true。
exports.main = async (event) => {
const { queryStringParameters } = event;
// 参数验证
if (!queryStringParameters?.userId) {
return {
statusCode: 400,
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
error: "Bad Request",
message: "userId 参数不能为空"
})
};
}
// 业务逻辑
const userId = queryStringParameters.userId;
try {
// ... 处理业务逻辑
return {
statusCode: 200,
body: JSON.stringify({ success: true })
};
} catch (error) {
return {
statusCode: 500,
body: JSON.stringify({
error: "Internal Server Error",
message: error.message
})
};
}
};
exports.main = async () => {
return {
statusCode: 200,
headers: {
"Content-Type": "application/javascript"
},
body: `
console.log("Hello from CloudBase!");
window.cloudbaseConfig = {
envId: "your-env-id",
region: "ap-shanghai"
};
`
};
};
可用于动态生成 JavaScript 配置文件。
安装第三方依赖
当云函数需要使用第三方 npm 包时,需要先安装相应的依赖包。CloudBase 在线编辑器提供了便捷的依赖管理功能。
打开终端
在 CloudBase 在线编辑器中,您可以通过以下方式打开终端:
- 快捷键:使用
Ctrl + J(Windows/Linux)或command + J (macOS) - 菜单操作:点击编辑器上方的「终端」按钮,选择「新建终端」
安装依赖
在终端中使用 npm add 命令安装所需的依赖包。
以安装 CloudBase Node.js SDK 为例:
npm add @cloudbase/node-sdk
安装其他常用依赖包:
# 时区处理库
npm add moment-timezone
# HTTP 请求库
npm add axios
# 工具库
npm add lodash
使用依赖
安装完成后,您可以在代码中引用这些依赖:
在云函数 Node.js 环境中无法直接采用 ES Module 规范编写代码,主要原因在于,云函数默认支持的入口文件(index.js)必须遵循 CommonJS 规范,若需要使用 ES Module 规范请参考 使用-es-module-规范
const cloudbase = require('@cloudbase/node-sdk');
exports.main = async (event, context) => {
// 初始化 CloudBase
const app = cloudbase.init({
env: 'your-envid', // 替换为您的环境 ID
});
const db = app.database();
const collection = db.collection('users');
// 查询数据
const { data } = await collection.get();
return {
success: true,
count: data.length,
};
};