云对象是普通云函数的升级版,功能和云函数是一样的。它在大多数场景下替代了普通云函数。
云对象是对象化的云函数,比如一个文章云对象,它可以包括文章的创建,文章的删除,文章的编辑等功能。
(一句话描述云对象: 等同于PHP后端部份)
一、创建云对象
打开项目,找到uniCloud / cloudfunctions ,右击cloudfunctions文件夹,选择“新建云函数/云对象”
创建好的云对象包含二个文件:
index.obj.js //云对象代码文件
package.json //云对象配置文件
二、云对象代码模板
// 开发文档: https://uniapp.dcloud.net.cn/uniCloud/cloud-obj //导入验证码公共模块 const uniCaptcha = require('uni-captcha') //获取数据库对象 const db = uniCloud.database(); //获取数据表opendb-verify-codes对象 const verifyCodes = db.collection('opendb-verify-codes') module.exports = { //_before:又称拦截器。它是在请求云对象方法前执行。一般用于拦截器、统一的身份验证、参数校验等。 _before: async function () { //当前请求的云对象中add方法时,如果未登陆则提示出错 const methodName = this.getMethodName() if(methodName === 'add' && !this.getUniIdToken()) { throw new Error('token不存在') } //保存开始执行时间,在后面_after内用于统计执行耗时 this.startTime = Date.now() }, //_after:它是在请求云对象方法后执行 _after(error, result) { if(error) { throw error // 如果方法抛出错误,也直接抛出不处理 } //给当前执行的云函数增加timeCost属性,统计该云函数执行耗时 result.timeCost = Date.now() - this.startTime return result }, //_timing:当该云对象定时执行时,会触发此方法 _timing: function (param) { console.log('触发时间:', param.Time) console.log('triggered by timing') }, //云对象的方法 add: function(title = '', content = '') { if(title === 'abc') { throw new Error('abc不是一个合法的todo标题') } return { errCode: 0, errMsg: '创建成功' } } }
编写云对象时,统一返回格式,如下:
//执行正确返回样式 return { errCode: 0, errMsg: '创建成功', id: 123 //其它相关结果 } //执行错误返回样式 return { errCode: 'INVALID_TODO', errMsg: 'TODO标题或内容不可为空' }
三、云对象的调用
云对象可以在前端调用,也可以在云函数、云对象内调用。都是采用:uniCloud.importObject调用云对象。
方式一:
const todo = uniCloud.importObject('todo') //引入云对象实例 try { const res = await todo.add('title demo', 'content demo') //调用该对象的方法。 console.log(res) } catch (e) { console.log(e.errCode) console.log(e.errMsg) }
方式二:
const todo = uniCloud.importObject('todo') //引入云对象实例
//执行该对象的方法 todo.add('title demo', 'content demo').then(res => { console.log(res) }).catch(e => { console.log(e.errCode) console.log(e.errMsg) })
四、云对象可以调用的方法及this指针
- 云对象支持 js 和 nodejs 的标准API,如console.log()、setTimeout()
- 云对象可以调用所有uniCloud的API:
API | 描述 |
---|---|
uniCloud.database() | 云数据库对象 详情 |
uniCloud.databaseJQL() | 云函数中使用JQL语法操作数据库 详见,需添加扩展库 |
uniCloud.redis() | 使用redis 详见,需添加扩展库 |
uniCloud.uploadFile() | 云函数上传文件到云存储 详情 |
uniCloud.downloadFile() | 云函数下载云存储的文件到云函数运行环境 详情 |
uniCloud.deleteFile() | 云函数删除云存储的文件 详情 |
uniCloud.getTempFileURL() | 获取云存储文件的临时路径 详情 |
uniCloud.customAuth() | 使用云厂商自定义登录,仅腾讯云支持详情 |
uniCloud.callFunction() | 云函数/云对象中调用另一个云函数 见下 |
uniCloud.importObject() | 云函数/云对象中调用另一个云对象 详情 |
uniCloud.httpclient | 云函数中通过http访问其他系统 见下 |
uniCloud.httpProxyForEip | 使用云厂商代理访问http服务(阿里云的解决微信需要固定IP的方案),仅阿里云云端环境支持 详见,新增于HBuilderX 3.5.5 |
uniCloud.sendSms() | 发送短信,需添加扩展库 详见 |
uniCloud.getPhoneNumber() | 获取一键登录手机号,需添加扩展库 详见 |
uniCloud.init() | 获取指定服务空间的uniCloud实例 详见 |
uniCloud.logger | 云函数中打印日志到uniCloud web控制台的日志系统(非HBuilderX控制台)详情 |
uniCloud.getRequestList | 获取当前云函数实例内正在处理的请求Id列表 详见,新增于HBuilderX 3.5.5 |
uniCloud.getClientInfos | 获取当前云函数实例内正在处理的请求对应的客户端信息列表 详见,新增于HBuilderX 3.5.5 |
uniCloud.getCloudInfos | 获取当前云函数实例内正在处理的请求对应的云端信息列表 详见,新增于HBuilderX 3.5.5 |
- 云对象没有云函数的context参数,在云对象中获取上下文是通过this指针。
- this.getClientInfo() 获取客户端信息
module.exports = { add: function() { const clientInfo = this.getClientInfo() // clientInfo = { // clientIP, String 客户端ip // appId, // deviceId, // requestId, string 请求id // source, string (client | function | http | timing | server) // client uni-app客户端导入云对象调用 // function 由其他云函数或云对象调用 // http 云对象URL化后通过http访问调用 // timing 定时任务调用云对象 // server 云函数上传并运行 // userAgent, string 客户端ua,注意非本地运行环境下客户端getSystemInfoSync也会获取ua参数并上传给云对象,但是云对象会从http请求头里面获取ua而不是clientInfo里面的ua // //... 其他getSystemInfoSync返回值 // } } }
- this.getCloudInfo()获取云端信息
module.exports = { add: function(){ const cloudInfo = this.getCloudInfo() // cloudInfo = { // provider, String 服务空间供应商,支付宝云为:alipay,阿里云为:aliyun,腾讯云为:tencent // spaceId, String 服务空间Id // useOldSpaceId, Boolean 当前获取的服务空间id是否为迁移前的服务空间id // functionName, String 云对象名称 // functionType, String 云对象此值固定为cloudobject // } } }
- this.getUniIdToken()获取客户端token
module.exports = { add: function(){ const token = this.getUniIdToken() if(!token) { // 登录状态无效 } } }
token是一个加密的字符串。如需解开token,拿到用户的uid、role、permission,则需要导入 uni-id-common 公共模块调用 checkToken 方法。详见:https://doc.dcloud.net.cn/uniCloud/uni-id/cloud-common.html#checktoken
- this.getMethodName()获取当前调用的方法名
module.exports = { _before: function() { // _before的用法请看后续章节 const methodName = this.getMethodName() // add } }
- this.getParams()获取当前参数列表
module.exports = { _before: function() { // _before的用法请看后续章节 const params = this.getParams() // ['title demo', 'content demo'] } }
在云对象的方法里,参数可以直接获取。本方法主要用于在__before等拦截器方法里,判断客户端上传的信息进行处理
- this.getUniCloudRequestId()获取当前请求id
module.exports = { _after: function(error, result) { if(error) { const requestId = this.getUniCloudRequestId() // log(requestId, error) 出错时记录日志,log方法需自行实现 } } }
- this.getHttpInfo()获取url化时的http信息
module.exports = { _before: function() { const httpInfo = this.getHttpInfo() } }
返回结构如下:
{ path: 'HTTP请求路径,如 /hello', httpMethod: 'HTTP请求方法,如 GET', headers: {HTTP请求头}, queryStringParameters: {HTTP请求的Query,键值对形式}, body: 'HTTP请求体', isBase64Encoded: 'true or false,表示body是否为Base64编码' }
五、定时执行云对象
有二种方式设置定时执行云对象:
1)web控制台设置(建议这种方式)
打开uniCloud的web控制台(https://unicloud.dcloud.net.cn/),找到该云函数,点击进去配置:
在定时触发器点击“编辑”按钮
在编辑框内设置你的定时计划,详见:https://doc.dcloud.net.cn/uniCloud/trigger.html#config-param
如果对计划配置不了解,也可以直接在http://cron.ciding.cc/ 内生成配置,导入到编辑框内。
2)第二种方式,能过云对象的package.json文件,配置定时属性详见:https://doc.dcloud.net.cn/uniCloud/cf-functions.html#packagejson
七、云对象的URL
云对象可以通过URL方式执行。在外部程序要访问uniCloud场景时,非常有用。比如第三方网站要获取项目数据。
操作方法:
登陆web控制台(https://unicloud.dcloud.net.cn/)找到该云对象,设置URL路径,如下图:
当使用云对象URL时,先绑定自已的域名(域名需要备案,如果你是阿里云空间,则要在阿里云备案后才能使用),操作如下:
登陆web控制台(https://unicloud.dcloud.net.cn/)点击函数/对象列表,点击绑定域名,如下图:
云对象URL请求路径格式:url化路径/云对象方法名 注意结尾没有/符,且区分大小写。比如:https://xxxx/todo/add
云对象中获取GET请求的参数:
module.exports = { addTodo: function(params) { console.log(params) return { errCode: 0 } } }
云对象中获取POST请求的参数(如:post一个json内容到云对象):
module.exports = { addTodo: function(params) { const httpInfo = this.getHttpInfo() let body = httpInfo.body //POST数据为base4编码 if(httpInfo.isBase64Encoded){ body = Buffer.from(body, 'base64').toString('utf8') // 将base64格式转换成字符串 body = JSON.parse(body); //转换成json } return { errCode: 0 } } }
八、云对象获取cookie
首先需要安装cookie库,可以通过npm install cookie 安装,代码如下:
'use strict'; //引入cookie const cookie = require('cookie') module.exports = { addTodo: function () { const httpInfo = this.getHttpInfo() //在这里获取相关数据 const cookieData = cookie.parse(httpInfo.headers.cookie || '') //设置cookie到客户端 const cookieOptions = { //具体参数请查阅 https://www.npmjs.com/package/cookie maxAge: 60 * 60 * 24 * 7,//一周 path:"/" } const setCookieData = cookie.serialize('app', 'appName', cookieOptions) return { statusCode: 200, headers: { 'content-type': '返回数据类型', 'set-cookie': setCookieData // 在headers内返回set-cookie用于设置客户端cookie }, body: '返回数据' } } };
标签:function,const,函数,对象,---,uniCloud,概述,cookie From: https://www.cnblogs.com/wm218/p/18139765