社区/学习指南/云开发 Serverless 极简入门手册

数据库 CRUD

上一节演示了云函数的基本 DEMO,但是比较简单,就直接返回了一个“好好学习” 的 JSON 对象。这一小节来熟悉数据库。

云开发提供了一个 NoSQL 数据库,数据库中的每条记录都是一个 JSON 格式的对象。一个数据库可以有多个集合(相当于关系型数据中的表),集合可看做一个 JSON 数组,数组中的每个对象就是一条记录。

一般我们称数据记录的增加(Create)、读取(Retrieve)、更新(Update)和删除(Delete) 统称为 CRUD。下面,我们基于云函数对数据库进行操作。

创建数据库集合(表)和创建一个云函数

第 1 步:创建一个数据集合,取名为 users

第 2 步:创建 4 个云函数,分别取名为:

  • insert_db
  • query_db
  • update_db
  • delete_db

如下图:

如果还不了解如何创建云函数,可以查看上一篇「编写第一个云函数」

插入数据

点击云函数列表中的 “insert_db” 函数,进入代码编辑页面。在编写代码之前,我们需要安装一个 Node.js 模块 tcb-admin-node , 该模块提供了在云函数或者说在 Node.js 服务端器环境下,可以操作数据库、云存储等的一些方法/API。

创建 package.json 文件

因为需要引入 tcb-admin-node 模块,所以先要创建 package.json 文件,可以按照如下图片 1,2,3,4 进行。最后记得点击【保存并安装依赖】。

package.json 文件内容如下,可以复制进去。

{
  "dependencies": {
    "tcb-admin-node": "*"
  }
}

编写代码

第 1 步: 获取该环境 ID
在控制台左侧边栏点击【环境】,点击【环境纵览】,复制环境 ID。后面代码需要通过环境 ID,访问环境的资源,例如数据库。

第 2 步: 编写代码
往 index.js 文件中编写如下代码,并点击【保存并安装依赖】,代码如下:

"use strict";
const tcb = require("tcb-admin-node");
const app = tcb.init({
  env: "你的环境 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') 引入云开发 Node.js SDK;
  • const app = tcb.init({}) 初始化环境;
  • app.database() 获取数据的引用;
  • db.collection('users') 其中 users 是 6.1 节中创建的数据库集合,或者说“表”,这里获取集合的引用;
  • add({}) 方法,输入参数为 JSON 对象,这里是一个 user 记录;
  • asyncawait JavaSript API,可以将异步转成同步操作;

第 3 步:开启 HTTP 触发和路径配置
整个配置过程可以参见上一篇 「编写第一个云函数」 。配置一个触发路径,如下图:

第 4 步:访问 HTTP 并验证数据是否插入
点击链接,浏览器打开访问一次,就插入一次数据。我们点击左侧边栏【数据库】,再点击数据库【users】,即可看到如下数据:

多请求几次数据库就会出现多几条数据。

查询数据

这里,我们使用一开始创建的 query_db 云函数。当然你可以继续使用 insert_db 函数。如果不是使用上面的函数,这里我们同样需要做以下几件事:

  • 创建 package.json 并且填写 package.json 内容,见 6.2.1 节;
  • 使用【保存并安装依赖】按钮;
  • 需要复制环境 ID;
  • 需要配置云函数 HTTP 触发路径, 例如 /query_db

查询的代码具体如下所示:

"use strict";
const tcb = require("tcb-admin-node");
//初始化环境
const app = tcb.init({
  env: "你的环境 ID",
});

//获取数据引用
const db = app.database();

exports.main = async (event, context) => {
  //使用 where 方法查询 name 为 test 数据
  //链式调用 get 方法,执行查询过程并返回数据
  let result = await db
    .collection("users")
    .where({
      name: "test",
    })
    .get();
  //获取返回的数据结果
  return result.data;
};

访问配置的 HTTP 触发路径,即可查询之前插入的数据,上面的插入请求了 3 次,所以数据返回的 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"
  }
]

如果需要返回两条数据,可以使用 limit(2) ,返回 N 条,就 limit(N) 例如:

let result = await db.collection("users").where({ name: "test" }).limt(2).get();

更新数据

同样,如果是使用新创建的云函数,需要做以下几件事:

  • 创建 package.json 并且填写 package.json 内容,见 6.2.1 节;
  • 使用【保存并安装依赖】按钮;
  • 需要复制环境 ID;
  • 需要配置云函数 HTTP 触发路径, 例如 /update_db

这里我想更新所有符合要求的记录的 age 值,全部更新为 88 岁,代码如下:

"use strict";
const tcb = require("tcb-admin-node");
//初始化环境
const app = tcb.init({
  env: "你的环境 ID",
});

//获取数据引用
const db = app.database();

exports.main = async (event, context) => {
  //使用 where 方法查询 name 为 test 数据
  //将符合要求的数据的 age 字段值更新为 88
  let result = await db
    .collection("users")
    .where({
      name: "test",
    })
    .update({
      age: 88,
    });
  return result;
};

同样请求 HTTP 服务,完成更新操作,浏览器返回数据如下,说明符合要求的 3 条数据均已更新。

{
  "requestId": "1589636820392_1_01781",
  "updated": 3
}

update 方法是局部更新,用于更新字段;如果替换某条记录,可以使用 set 方法,具体见 数据库替换更新

删除数据

同样,如果是使用新创建的云函数,需要做以下几件事:

  • 创建 package.json 并且填写 package.json 内容,见 6.2.1 节;
  • 使用【保存并安装依赖】按钮;
  • 需要复制环境 ID;
  • 需要配置云函数 HTTP 触发路径, 例如 /delete_db
"use strict";
const tcb = require("tcb-admin-node");
//初始化环境
const app = tcb.init({
  env: "serverless-1d83e7",
});

//获取数据引用
const db = app.database();

exports.main = async (event, context) => {
  //使用 where 方法查询 name 为 test 数据
  //remove 删除符合条件的所有数据
  let result = await db
    .collection("users")
    .where({
      name: "test",
    })
    .remove();
  return result;
};

通过 HTTP 触发云函数,浏览器返回 3 条数据被删除:

{
  "requestId": "1589637228874_1_51061",
  "deleted": 3
}

通过 where 方法可以删除符合条件的所有数据,如果只想删除指定 _id 字段的 1 条数据,可以参见 删除一条记录

附录

本文出自 王利华