目录
云函数是运行在云端的 JavaScript
代码,是基于 Node.js
的扩展。
概述:
云函数即在云端(服务器端)运行的函数,开发者无须购买、搭建服务器,只需编写函数代码并部署到云端即可在客户端(App、H5、小程序等)调用,同时云函数之间也可以相互调用。
一个云函数的写法与一个在本地定义的JavaScript方法无异,当云函数被客户端调用时,定义的代码会被放在Node.js运行环境中执行。
开发者可以和在Node.js环境中使用JavaScript一样在云函数中进行网络请求等操作,而且还可以通过云函数服务端SDK搭配使用多种服务,如使用云函数SDK中提供的数据库和存储API操作数据库和存储。
每个云函数是一个目录,其中普通云函数有index.js
入口文件,云对象的入口文件则是index.obj.js
。
一个最简单的云函数只需要这个入口js文件,在里面编写代码即可。当然也可以在这个js中require该云函数目录下的其他js、json文件。
云函数的配置文件和 npm规范 相同,在云函数目录下可新建一个 package.json 来存放配置。uniCloud云函数扩展了 package.json,增加了一些特有的配置项。详见
云函数启动后实例会保留一段时间(如15分钟),超过保留期后若该云函数一直没有被再调用,那这个实例会被释放。所以云函数有冷启动的概念。不过由于js实例的启动要比php和java更快,所以js更适合serverless方式。
注意事项
- 云函数内使用commonjs规范,不可使用import、export,参考:commonjs模块
- 不同项目使用同一个服务空间时,不可使用同名云函数。同名云函数会相互覆盖。
- 在HBuilderX创建云函数时,如果新云函数与服务器上已存在同名云函数,会用新函数覆盖。所以应先选择从服务空间下载云函数。
- 单个云函数大小限制为10M(包含
node_modules
),过大的云函数影响运行性能,也会增加计费的gbs。同时支付宝云与腾讯云支持在云端安装node_modules
,此时不占用云函数体积。 - uniCloud的阿里云版与支付宝云版,暂不可使用相对路径读取文件(比如
fs.readFileSync('./info.txt')
),可以使用绝对路径fs.readFileSync(path.resolve(__dirname,'./info.txt'))
具体介绍参考官网
创建项目
创建一个带ui库的项目,选择vue2,并选择启用uniClound选择阿里云(有免费)
创建云服务空间
右键选择关联云服务空间去新建一个云函数
跳转到浏览器后选择新建一个云服务空间,选择购买一个免费的,有需求的小伙伴可以自行选择合适的
关联云服务空间
回到项目,再次右键uniClound选择关联云服务空间初始化引导,根据引导做就好了,项目选择需要云函数的项目,出现在项目里即关联成功,至此,uniClound的环境配置完成,可以开始使用了。
创建云函数
右键选择uniClound下属文件夹cloudfunctions创建云函数,写好名字默认模板新建就好
使用云函数
例子如下
文档结构部分
登录的云函数
代码运行部分
uniClound链接数据库,collection链接数据库表
'use strict';
exports.main = async (event, context) => {
//event为客户端上传的参数
console.log('event : ', event)
// de 登录接口
// 1 连接数据库
var db = uniCloud.database();
// 2 接收前端传入的用户数据,与数据库表里的用户数据作对比
// event.和前端的名字相对应
// 变量名和数据库表名一致
var name=event.name;
var username = event.username;
var password = event.password;
// 条件查询 全部查询 await db.collection('表名').get()
var result = await db.collection('user').where({
username: username
}).get()
console.log(result)
// 判断是否存在
if (result.affectedDocs == 0) {
return {
code: 500,
msg: "用户不存在"
}
} else {
// 校验密码是否正确
// 因为返回的是个数组所以用data[0]
if (password == result.data[0].password) {
return {
code: 200,
msg: "登录成功",
// 拿到登录数据
user: result.data[0]
}
} else {
// 信息一致则返回登录成功,信息不对则返回
return {
code: 500,
msg: "密码错误"
}
}
}
//返回数据给客户端
return result
};
页面调用部分
//在methods中写方法
login() {
uniCloud.callFunction({
// 云函数名字
name: "btn-login",
//函数传参
data: {
username: this.username,
password: this.password
},
// 用箭头函数
// success 回调函数
success: (res) => {
console.log(res);
if (res.result.code == 200) {
uni.showToast({
titlt: "登录成功"
})
// setTimeout 定时器
// switchTab 跳转到 tabBar页面
// navigateTo 跳转到 普通页面
setTimeout(() => {
uni.switchTab({
url: "/pages/index/index"
})
// 把用户信息本地储存
// uni.setStorageSync("name", res.result.user.name)
uni.setStorage({
key:'name',
data:res.result.user,
success:function(){
console.log('success');
}
})
}, 20)
} else {
// showToast 显示消息提示框
uni.showToast({
titlt: res.result.msg,
icon: "none"
})
}
},
})
},
用法演示完毕