首页 > 其他分享 >uniCloud云函数概述---云对象

uniCloud云函数概述---云对象

时间:2024-04-17 16:15:04浏览次数:29  
标签:function const 函数 对象 --- uniCloud 概述 cookie

云对象是普通云函数的升级版,功能和云函数是一样的。它在大多数场景下替代了普通云函数。

云对象是对象化的云函数,比如一个文章云对象,它可以包括文章的创建,文章的删除,文章的编辑等功能。

(一句话描述云对象: 等同于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指针。
  1. 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返回值
          // }
      }
    }

     

  2. 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
          // }
      }
    }

     

  3. 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

  4. this.getMethodName()获取当前调用的方法名
    module.exports = {
      _before: function() { // _before的用法请看后续章节
        const methodName = this.getMethodName() // add
      }
    }
  5. this.getParams()获取当前参数列表
    module.exports = {
      _before: function() { // _before的用法请看后续章节
        const params = this.getParams() // ['title demo', 'content demo']
      }
    }

    在云对象的方法里,参数可以直接获取。本方法主要用于在__before等拦截器方法里,判断客户端上传的信息进行处理

  6. this.getUniCloudRequestId()获取当前请求id
    module.exports = {
      _after: function(error, result) {
        if(error) {
          const requestId = this.getUniCloudRequestId() // log(requestId, error) 出错时记录日志,log方法需自行实现
        }
      }
    }

     

  7. 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

相关文章

  • 集英社-富硒土壤对茶叶品质影响 调查报告
    谨以此文,悼念我炸裂的计应数期中考试。下次不仅要带一个脑子做题,还得带一个脑子盯着它做题,不然第一个脑子容易跑偏刹不住车。得去黑市看一眼最近脑子市价如何,如果太贵还得卖点东西凑一凑。\[\newcommand{\d}{\mathrmd}\newcommand{\i}{\mathbfi}\]简介:你说的对,但是「集英社」......
  • Azkaban - [01] 概述
    简单的任务调度使用crontab、复杂的任务调度使用oozie、azkaban等开发调度系统。 一、为什么学习Azkaban  一个完整的数据分析系统通常都是由大量任务单元(shell脚本、java程序、MapReduce程序、Hive脚本等)组成。各任务单元之间存在先后及前后依赖关系,为了组织起这样的复杂......
  • SQL语法错误-java.sql.SQLSyntaxErrorException: You have an error in your SQL synt
    频繁爆出这样的错误:java.sql.SQLSyntaxErrorException:YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear''atline1查阅了许多资料后,我怀疑报错可能与字段名不小心用了关键字有关......
  • conversion-operator
    参考文档user-definedconversionfunction-cppreference.comTheSafeBoolIdiom-知乎一般形式为operator*type*()const,比如:operatorint()const;operatorbool()const;operatorAA()const;自定义类型转换structTo{To()=default;To(conststru......
  • 5-02. 创建 AudioMixer 实现音乐音效的控制和切换
    创建AudioMixer修改AudioMixer可以增加Snapshots可以增加Groups创建一个只有背景音乐的快照静音的快照暴露音量选中Music,然后右键Music然后就能在ExposedParameters看到暴露出来的变量可以改名为MusicVolume用同样的方法暴露出Ambient并修改名字......
  • MBR40100PT-ASEMI肖特基二极管MBR40100PT
    编辑:llMBR40100PT-ASEMI肖特基二极管MBR40100PT型号:MBR40100PT品牌:ASEMI封装:TO-247最大平均正向电流(IF):40A最大循环峰值反向电压(VRRM):100V最大正向电压(VF):0.88V工作温度:-40°C~170°C反向恢复时间:5ns芯片个数:2芯片尺寸:130mil引脚数量:3正向浪涌电流(IFMS):400A包装方式:50/......
  • java多线程 读取list--动态读取list
    java多线程读取list--动态读取list的案例 本次介绍,我使用的是synchronized同步代码块的关键字来读取list,在写java多线程时,一定要注意synchronized关键字的有效范围。ps:如果synchronized关键字的代码块范围太大,可能会导致优先获取到cpu资源的第一个线程在满足条件的情......
  • 前端【小程序】03-小程序基础篇【组件】【导航】【图片】【轮播图】【表单】【区域滚
    navigator文档:https://developers.weixin.qq.com/miniprogram/dev/component/navigator.htmlurl:页面路径•支持相对和绝对路径•路径为空时会报错hover-class:点击态的样式,默认按下时会有一个样式•none禁用点击效果open-type:跳转方......
  • LeetCode 面试经典150题---007
    ####13.罗马数字转整数罗马数字包含以下七种字符:I,V,X,L,C,D和M。字符数值I1V5X10L50C100D500M1000例如,罗马数字2写做II,即为两个并列的1。12写做X......
  • 持续性学习-Day14(前端基础HTML5)
    参考教学视频:秦疆 HTML(HyperTexctMarkupLanguage)超文本标记语言W3C:WorldWideWebConsortium万维网联盟W3C标准包括:结构化标准语言(HTML、XML)表现标准语言(CSS)行为标准(DOM、EXMAScript)1.基本标签<!--标题标签--><!--h1-h5--><!--段落标签--><p></p><!--......