上一節(jié)演示了云函數(shù)的基本 DEMO,但是比較簡(jiǎn)單,就直接返回了一個(gè)“好好學(xué)習(xí)” 的 JSON 對(duì)象。這一小節(jié)來(lái)熟悉數(shù)據(jù)庫(kù)。
云開(kāi)發(fā)提供了一個(gè) NoSQL 數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)中的每條記錄都是一個(gè) JSON 格式的對(duì)象。一個(gè)數(shù)據(jù)庫(kù)可以有多個(gè)集合(相當(dāng)于關(guān)系型數(shù)據(jù)中的表),集合可看做一個(gè) JSON 數(shù)組,數(shù)組中的每個(gè)對(duì)象就是一條記錄。
一般我們稱(chēng)數(shù)據(jù)記錄的增加(Create)、讀取(Retrieve)、更新(Update)和刪除(Delete) 統(tǒng)稱(chēng)為 CRUD。下面,我們基于云函數(shù)對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作。
第1步:創(chuàng)建一個(gè)數(shù)據(jù)集合,取名為 users
第2步:創(chuàng)建 4 個(gè)云函數(shù),分別取名為:
如下圖:
如果還不了解如何創(chuàng)建云函數(shù),可以查看上一篇「編寫(xiě)第一個(gè)云函數(shù)」
點(diǎn)擊云函數(shù)列表中的 “insert_db” 函數(shù),進(jìn)入代碼編輯頁(yè)面。在編寫(xiě)代碼之前,我們需要安裝一個(gè) Node.js 模塊 tcb-admin-node
, 該模塊提供了在云函數(shù)或者說(shuō)在Node.js 服務(wù)端器環(huán)境下,可以操作數(shù)據(jù)庫(kù)、云存儲(chǔ)等的一些方法/API。
因?yàn)樾枰?tcb-admin-node
模塊,所以先要?jiǎng)?chuàng)建 package.json 文件,可以按照如下圖片1,2,3,4進(jìn)行。最后記得點(diǎn)擊【保存并安裝依賴(lài)】。
package.json 文件內(nèi)容如下,可以復(fù)制進(jìn)去。
{
"dependencies": {
"tcb-admin-node": "*"
}
}
第 1 步: 獲取該環(huán)境 ID
在控制臺(tái)左側(cè)邊欄點(diǎn)擊【環(huán)境】,點(diǎn)擊【環(huán)境縱覽】,復(fù)制環(huán)境 ID。后面代碼需要通過(guò)環(huán)境 ID,訪(fǎng)問(wèn)環(huán)境的資源,例如數(shù)據(jù)庫(kù)。
第 2 步: 編寫(xiě)代碼
往 index.js 文件中編寫(xiě)如下代碼,并點(diǎn)擊【保存并安裝依賴(lài)】,代碼如下:
'use strict';
const tcb = require('tcb-admin-node')
const app = tcb.init({
env: '你的環(huán)境 ID'
})
const db = app.database()
exports.main = async (event, context) => {
let result = await db.collection('users').add({
name: 'test',
age: 25,
create_time: new Date()
})
return result
}
下面分析代碼:
const tcb = require('tcb-admin-node')
引入云開(kāi)發(fā) Node.js SDK;const app = tcb.init({})
初始化環(huán)境;app.database()
獲取數(shù)據(jù)的引用; db.collection('users')
其中 users 是 6.1 節(jié)中創(chuàng)建的數(shù)據(jù)庫(kù)集合,或者說(shuō)“表”,這里獲取集合的引用;add({})
方法,輸入?yún)?shù)為 JSON 對(duì)象,這里是一個(gè) user 記錄; async
和 await
JavaSript API,可以將異步轉(zhuǎn)成同步操作;
第 3 步:開(kāi)啟 HTTP 觸發(fā)和路徑配置
整個(gè)配置過(guò)程可以參見(jiàn)上一篇 「編寫(xiě)第一個(gè)云函數(shù)」 。配置一個(gè)觸發(fā)路徑,如下圖:
第 4 步:訪(fǎng)問(wèn) HTTP 并驗(yàn)證數(shù)據(jù)是否插入
點(diǎn)擊鏈接,瀏覽器打開(kāi)訪(fǎng)問(wèn)一次,就插入一次數(shù)據(jù)。我們點(diǎn)擊左側(cè)邊欄【數(shù)據(jù)庫(kù)】,再點(diǎn)擊數(shù)據(jù)庫(kù)【users】,即可看到如下數(shù)據(jù):
多請(qǐng)求幾次數(shù)據(jù)庫(kù)就會(huì)出現(xiàn)多幾條數(shù)據(jù)。
這里,我們使用一開(kāi)始創(chuàng)建的 query_db
云函數(shù)。當(dāng)然你可以繼續(xù)使用 insert_db
函數(shù)。如果不是使用上面的函數(shù),這里我們同樣需要做以下幾件事:
/query_db
; 查詢(xún)的代碼具體如下所示:
'use strict';
const tcb = require('tcb-admin-node')
//初始化環(huán)境
const app = tcb.init({
env: '你的環(huán)境 ID'
})
//獲取數(shù)據(jù)引用
const db = app.database()
exports.main = async (event, context) => {
//使用 where 方法查詢(xún) name 為 test 數(shù)據(jù)
//鏈?zhǔn)秸{(diào)用 get 方法,執(zhí)行查詢(xún)過(guò)程并返回?cái)?shù)據(jù)
let result = await db.collection('users').where({
name: 'test'
})
.get()
//獲取返回的數(shù)據(jù)結(jié)果
return result.data
}
訪(fǎng)問(wèn)配置的 HTTP 觸發(fā)路徑,即可查詢(xún)之前插入的數(shù)據(jù),上面的插入請(qǐng)求了 3 次,所以數(shù)據(jù)返回的 3 條。
[
{
"_id": "5e847ab25ebfe17b0112ef031602897d",
"age": 25,
"create_time": "2020-05-16T12:50:03.492Z",
"name": "test"
},
{
"_id": "e2297d935ebfe86b00bcb9cb6e7c7f1a",
"age": 25,
"create_time": "2020-05-16T13:19:39.931Z",
"name": "test"
},
{
"_id": "a9bfcffc5ebfe88700b26c896baeac9f",
"age": 25,
"create_time": "2020-05-16T13:20:07.279Z",
"name": "test"
}
]
如果需要返回兩條數(shù)據(jù),可以使用 limit(2) ,返回 N 條,就 limit(N) 例如:
let result = await db.collection('users').where({ name: 'test'})
.limt(2)
.get()
同樣,如果是使用新創(chuàng)建的云函數(shù),需要做以下幾件事:
/update_db
; 這里我想更新所有符合要求的記錄的 age 值,全部更新為 88 歲,代碼如下:
'use strict';
const tcb = require('tcb-admin-node')
//初始化環(huán)境
const app = tcb.init({
env: '你的環(huán)境 ID'
})
//獲取數(shù)據(jù)引用
const db = app.database()
exports.main = async (event, context) => {
//使用 where 方法查詢(xún) name 為 test 數(shù)據(jù)
//將符合要求的數(shù)據(jù)的 age 字段值更新為 88
let result = await db.collection('users').where({
name: 'test'
}).update({
age: 88
})
return result
}
同樣請(qǐng)求 HTTP 服務(wù),完成更新操作,瀏覽器返回?cái)?shù)據(jù)如下,說(shuō)明符合要求的 3 條數(shù)據(jù)均已更新。
{
"requestId": "1589636820392_1_01781",
"updated": 3
}
update
方法是局部更新,用于更新字段;如果替換某條記錄,可以使用 set
方法,具體見(jiàn) 數(shù)據(jù)庫(kù)替換更新
同樣,如果是使用新創(chuàng)建的云函數(shù),需要做以下幾件事:
/delete_db
; 'use strict';
const tcb = require('tcb-admin-node')
//初始化環(huán)境
const app = tcb.init({
env: 'serverless-1d83e7'
})
//獲取數(shù)據(jù)引用
const db = app.database()
exports.main = async (event, context) => {
//使用 where 方法查詢(xún) name 為 test 數(shù)據(jù)
//remove 刪除符合條件的所有數(shù)據(jù)
let result = await db.collection('users').where({
name: 'test'
}).remove()
return result
}
通過(guò) HTTP 觸發(fā)云函數(shù),瀏覽器返回 3 條數(shù)據(jù)被刪除:
{
"requestId": "1589637228874_1_51061",
"deleted": 3
}
通過(guò) where 方法可以刪除符合條件的所有數(shù)據(jù),如果只想刪除指定 _id 字段的 1 條數(shù)據(jù),可以參見(jiàn) 刪除一條記錄
更多建議: