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

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

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

(一句话描述云对象: 等同于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调用云对象。

uniCloud.importObject 原型uniCloud.importObject(参数1,参数2): 其中参数2只针对客户端调用时有效

 

uniCloud.importObject('云对象名称', {
    customUI: false, // 是否取消自动展示的交互界面。默认为false,配置为true时取消自动展示的交互提示界面,以下配置均不再生效
    loadingOptions: { // loading相关配置
        title: '加载中...', // 显示的loading内的提示文字。默认值为:加载中...
        mask: true // 是否使用透明遮罩,配置为true时不可点击页面其他内容。默认值为:true
    },
    errorOptions: { // 错误界面相关配置
        type: 'modal', // 错误信息展示方式,可取值:modal(弹框,默认)、toast(toast消息框)。默认值为:modal
        retry: false // 是否展示重试按钮,仅在type为modal时生效。用户点击重试按钮时将重新请求调用的方法,默认为false
    },
  parseSystemError({ // 转化云对象内未捕获的错误,或客户端网络错误
    objectName, // 云对象名
    methodName, // 方法名
    params, // 调用方法时传的参数,注意params是一个数组
    errCode, // 请求返回的错误码
    errMsg // 请求返回的错误信息
  } = {}){
    return {
      errMsg: '系统错误,请稍后再试' // 用于展示的错误信息
    }
  }
})

 

 

方式一:

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: '返回数据'
    }
  }
};

 

posted @ 2024-04-17 16:05  1024记忆  阅读(1491)  评论(0)    收藏  举报