雲物件是普通雲函式的升級版,功能和雲函式是一樣的。它在大多數場景下替代了普通雲函式。
雲物件是物件化的雲函式,比如一個文章雲物件,它可以包括文章的建立,文章的刪除,文章的編輯等功能。
(一句話描述雲物件: 等同於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: '返回資料' } } };