uniCloud雲函式概述---雲物件

1024记忆發表於2024-04-17

雲物件是普通雲函式的升級版,功能和雲函式是一樣的。它在大多數場景下替代了普通雲函式。

雲物件是物件化的雲函式,比如一個文章雲物件,它可以包括文章的建立,文章的刪除,文章的編輯等功能。

(一句話描述雲物件: 等同於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: '返回資料'
    }
  }
};

相關文章