微信小程序云开发(4)云函数
在微信小程序云开发中,云函数是一个非常重要的概念,它允许开发者编写Node.js函数,并在特定的触发条件下运行这些函数。云函数可以用于处理业务逻辑、数据存储、消息推送等各种场景。
示例一:创建和调用简单的云函数
创建云函数
- 打开微信开发者工具:确保你已经创建了一个微信小程序项目,并启用了云开发。
新建云函数:
- 在微信开发者工具中,选择“云开发”菜单项。
- 点击“云函数”选项。
- 点击“新建函数”,填写函数名(例如:
hello
),选择运行环境(默认即可)。
编写云函数代码:
- 在新建的云函数目录中,找到并打开
index.js
文件。 - 编写如下代码:
exports.main = async (event, context) => { return { event, openid: event.openid, appid: event.appid, ip: event.clientIP, unionid: event.unionid, message: 'Hello from cloud function!' }; };
- 在新建的云函数目录中,找到并打开
调用云函数
在小程序端调用云函数:
- 在小程序的某个页面中,例如
index.js
,编写如下代码:
Page({ data: {}, onLoad: function(options) { this.callCloudFunction(); }, callCloudFunction: async function() { try { const result = await wx.cloud.callFunction({ name: 'hello', data: {} }); console.log(result.result); } catch (err) { console.error(err); } } });
- 在小程序的某个页面中,例如
示例二:使用云函数处理用户注册与登录
创建云函数
- 新建云函数:例如,创建一个名为
register
的云函数。 编写云函数代码:
- 在
register
云函数的index.js
文件中,编写如下代码:
const db = wx.cloud.database(); exports.main = async (event, context) => { try { // 假设 event 中包含了用户提交的数据 const { username, password } = event; // 检查用户是否已存在 const checkResult = await db.collection('users').where({ username }).get(); if (checkResult.data.length > 0) { throw new Error('User already exists'); } // 保存用户信息(假设 hashPassword 是一个加密函数) await db.collection('users').add({ data: { username, password: hashPassword(password), createdAt: new Date() } }); return { success: true, message: 'User registered successfully' }; } catch (err) { return { success: false, error: err.message || 'Unknown error' }; } };
- 在
调用云函数
在小程序端调用云函数:
- 在用户注册页面中,例如
register.js
,编写如下代码:
Page({ data: {}, formSubmit: async function(e) { const { username, password } = e.detail.value; try { const result = await wx.cloud.callFunction({ name: 'register', data: { username, password } }); console.log(result.result); if (result.result.success) { wx.showToast({ title: '注册成功', icon: 'success' }); } else { wx.showToast({ title: result.result.error, icon: 'none' }); } } catch (err) { console.error(err); } } });
- 在用户注册页面中,例如
示例三:使用云函数处理文件上传
创建云函数
- 新建云函数:例如,创建一个名为
uploadFile
的云函数。 编写云函数代码:
- 在
uploadFile
云函数的index.js
文件中,编写如下代码:
exports.main = async (event, context) => { try { const { filePath, filename, contentType } = event; // 上传文件 const fileResult = await wx.cloud.uploadFile({ cloudPath: filename, filePath, maxTime: 60, timeout: 60, success: function(res) { console.log(res.fileID); }, fail: function(err) { console.error('Upload failed:', err); } }); // 保存文件信息到数据库 const db = wx.cloud.database(); await db.collection('files').add({ data: { fileID: fileResult.fileID, filename, uploadedAt: new Date(), contentType } }); return { success: true, fileID: fileResult.fileID }; } catch (err) { return { success: false, error: err.message || 'Unknown error' }; } };
- 在
调用云函数
在小程序端调用云函数:
- 在文件上传页面中,例如
upload.js
,编写如下代码:
Page({ data: {}, chooseImage: function() { wx.chooseImage({ count: 1, sizeType: ['original', 'compressed'], sourceType: ['album', 'camera'], success: (res) => { const tempFilePaths = res.tempFilePaths; const fileName = tempFilePaths[0].split('/').pop(); this.uploadFile(tempFilePaths[0], fileName); } }); }, uploadFile: async function(filePath, fileName) { try { const result = await wx.cloud.callFunction({ name: 'uploadFile', data: { filePath, filename: fileName, contentType: 'image/jpeg' } }); console.log(result.result); if (result.result.success) { wx.showToast({ title: '上传成功', icon: 'success' }); } else { wx.showToast({ title: result.result.error, icon: 'none' }); } } catch (err) { console.error(err); } } });
- 在文件上传页面中,例如
注意事项
- 环境初始化:确保在微信开发者工具中初始化了云开发环境,并在小程序代码中调用了
wx.cloud.init
方法进行环境初始化。 - 云函数部署:每次修改云函数代码后,需要重新部署云函数才能生效。在微信开发者工具中,右键点击云函数目录,选择“上传并部署”即可。
- 权限管理:根据业务需求,设置合理的云函数权限,确保数据的安全性和隐私性。