返回

两行 JavaScript 代码轻松实现云函数 Todo 重构

前端

在上一篇文章中,我们已经详细讲解了各种云函数配置的含义,想必你已经跃跃欲试了。这篇文章,我们就按照之前的思路,来实现 Todo 应用。

前置知识

  • 如果你还没了解云函数的各种配置,可以先看看上篇文章:《Serverless 云开发高阶应用》
  • 本文以 Vue.js 作为示例,如果你还没有使用过 Vue.js,可以先学习一下基础知识。

实现步骤

1. 创建云函数

在控制台中新建一个云函数,配置如下:

  • 名称: todo-rebuild
  • 运行环境: Node.js 12
  • 触发器: HTTP

云函数代码如下:

const cloud = require('tencentcloud-sdk-nodejs')

const serverless = require('serverless-http')

const tcb = cloud.tcb

//tcb.init({
//  secretId: '',
//  secretKey: '',
//  // 这里填写你的云函数所在地域,如广州则为 ap-guangzhou
//  // 参见地域列表:https://cloud.tencent.com/document/product/583/18684
//  envName: 'YOUR_ENV_NAME',
//})
const app = express()

app.get('/list', async (req, res) => {
  res.setHeader('Access-Control-Allow-Origin', '*')
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE')
  res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type')
  res.setHeader('Access-Control-Allow-Credentials', true)

  const { openId } = req.query

  const result = await tcb.invokeFunction({
    name: 'tcb-demo-list',
    data: { openId },
  })
  res.json(result.data)
})

app.post('/add', async (req, res) => {
  res.setHeader('Access-Control-Allow-Origin', '*')
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE')
  res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type')
  res.setHeader('Access-Control-Allow-Credentials', true)

  const { openId, content } = req.body

  const result = await tcb.invokeFunction({
    name: 'tcb-demo-add',
    data: { openId, content },
  })
  res.json(result.data)
})

app.post('/update', async (req, res) => {
  res.setHeader('Access-Control-Allow-Origin', '*')
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE')
  res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type')
  res.setHeader('Access-Control-Allow-Credentials', true)

  const { openId, _id, content, isDone } = req.body

  const result = await tcb.invokeFunction({
    name: 'tcb-demo-update',
    data: { openId, _id, content, isDone },
  })
  res.json(result.data)
})

app.post('/delete', async (req, res) => {
  res.setHeader('Access-Control-Allow-Origin', '*')
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE')
  res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type')
  res.setHeader('Access-Control-Allow-Credentials', true)

  const { openId, _id } = req.body

  const result = await tcb.invokeFunction({
    name: 'tcb-demo-delete',
    data: { openId, _id },
  })
  res.json(result.data)
})

module.exports.handler = serverless(app)

2. 部署云函数

点击「部署」按钮,将云函数代码部署到云端。

3. 创建数据库

在控制台中新建一个云数据库,配置如下:

  • 名称: todo-rebuild
  • 地域: 与云函数相同的地域
  • 套餐类型: 免费套餐
  • 存储空间: 1 GB

4. 创建集合

在云数据库控制台中,选择刚才创建的数据库,然后点击「集合」标签,新建一个集合,配置如下:

  • 名称: todo
  • 字段:
{
  "content": "string",
  "isDone": "boolean",
  "openId": "string",
  "_id": "string"
}

5. 创建客户端

创建一个新的 Vue.js 项目,然后在 main.js 中添加以下代码:

import Vue from 'vue'
import App from './App.vue'

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
}).$mount('#app')

App.vue 中添加以下代码:

<template>
  <div id="app">
    <div>
      <input type="text" v-model="content">
      <button @click="addTodo">添加</button>
    </div>
    <ul>
      <li v-for="todo in todos" :key="todo._id">
        <input type="checkbox" v-model="todo.isDone">
        <span>{{ todo.content }}</span>
        <button @click="updateTodo(todo)">修改</button>
        <button @click="deleteTodo(todo)">删除</button>
      </li>
    </ul>
  </div>
</template>

<script>
import axios from 'axios'

export default {
  name: 'App',
  data() {
    return {
      content: '',
      todos: [],
    }
  },
  mounted() {
    this.getTodos()
  },
  methods: {
    async getTodos() {
      const res = await axios.get('/list')
      this.todos = res.data.data
    },
    async addTodo() {
      await axios.post('/add', {
        content: this.content,
        openId: 'YOUR_OPEN_ID',
      })
      this.getTodos()
    },
    async updateTodo(todo) {
      await axios.post('/update', {
        ...todo,
        openId: 'YOUR_OPEN_ID',
      })
      this.getTodos()
    },
    async deleteTodo(todo) {
      await axios.post('/delete', {
        _id: todo._id,
        openId: 'YOUR_OPEN_ID',
      })
      this.getTodos()
    },
  },
}
</script>

6. 运行客户端

npm run serve

打开浏览器,访问 http://localhost:8080,你将看到一个 Todo 列表应用。

结语

以上就是云函数 Todo 重构的全部内容了,是不是很简单?只需要两行 JavaScript 代码,你就可以轻松实现一个 Todo 应用。快去动手试试吧!