目录

阿里云七天云开发校园合伙人创造营 Day 3

使用 Midway Serverless 开发函数接口

云开发7天训练营学习计划

完结撒花 🎉 ,点击上面的链接可以回顾这七天的内容哦~

Day 3: 使用 Midway Serverless 开发函数接口

关于 Midway Serverless 的相关介绍,请参考 Day2 的文章

每日任务

今日任务为使用 Midway Serverless 创建一个函数,通过浏览器访问函数接口,返回 Midway Serverless 加上名字

/clouddev-day3/task.png
任务

1. 登入云开发平台创建应用

登入云开发平台,进入到应用列表,点击 创建新应用,新建一个 WEB 场景的 Midway Serverless 一体化解决方案 (For NodeJS10)

创建好后,进入 开发部署

/clouddev-day3/create.jpg
创建应用

2. 开发调试

进入 IDE 后,先在终端执行:

1
npm i --registry=https://registry.npm.taobao.org

安装 npm 依赖,因为依赖包很多,这里用了淘宝的镜像源,安装会更快。

此时我们需要自定义这个函数,打开函数文件 index.ts,位置在 src/apis/config/index.ts

/clouddev-day3/indexts.png
找到并修改函数文件

修改代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import { Provide, Func } from '@midwayjs/decorator'
@Provide()
export class IndexService {
  @Func('index.handler')
  async handler() {
    return {
      message: 'Hello Midway Serverless MicroLOONG', //修改这里
    }
  }
}

同时我们可以看到项目目录中有很多 tsx 文件,说明这是一个 Midway Serverless 和 React 一体化的项目

可以尝试执行 npm run dev 运行项目。

/clouddev-day3/rundev.png
运行成功提示

启动时会自动发一个请求到函数端拿数据,渲染到页面。点开上图所示的链接即可访问到该页面,在本地运行的话需要访问 locathost:3000

/clouddev-day3/response.png
返回数据

按 F12 打开开发者人员工具,点进网络,也可查看到 index 这个函数及其返回的内容。

技巧
本示例也是一个 Midway Serverless 项目,可以参考 Day2 的文章,使用 Midway 函数开发命令行工具,执行 f invoke -f index 调用该函数

任务拓展

创建一个会复读的钉钉群自定义机器人。

首先在钉钉开放平台登录开发者后台,按提示创建企业。

进入 应用开发,创建机器人。

/clouddev-day3/dingdev.png
创建机器人

进入机器人的管理页面,点击 版本管理与发布,用手机钉钉扫描 调试 的二维码进调试群,并上线机器人。

/clouddev-day3/group.png
加入调试钉钉群

使用 PC 版钉钉进入群,在右上角 群设置,进入 智能群助手 可以看到刚刚创建的机器人。

技巧
其实可以直接在现有的任何群创建机器人,部分群需要成为群主或管理员才能添加机器人,不过这种方式不能实现 @机器人 触发回话

在机器人设置里,开启消息推送,复制 Webhook 备用,在下方 安全设置 中需要设置其中一项,比如设置自定义关键词,之后可以提供关键词触发机器人对话。

/clouddev-day3/config.png
机器人设置

返回 IDE 修改函数文件 index.ts 代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import { Provide, Func, Inject } from '@midwayjs/decorator'
import axios from 'axios';  //导入axios包
@Provide()
export class IndexService {
  @Inject()                 //加入Inject注解
  ctx;                      //函数执行上下文
  @Func('index.handler')
  async handler() {
    return {
      message: 'Hello Midway Serverless MicroLOONG',
    }
  }
  @Func('ding.handler')     //增加ding函数
  async ding() {
	  const hook = '';      //此处填写Webhook
	  const body = this.ctx.request.body;
	  await axios.post(hook, {
		  msgtype: 'markdown',
		  markdown: {
		    title: 'test',
		    text: '复读:' + body.text.content, //引号内的内容可以为刚刚填写的关键词
		  }
	  });
  }  
}

由于增加多了一个 ding 函数,这里修改函数定义文件 f.ymlfunctions 下定义这个 ding 函数。

1
2
3
4
5
6
functions:
  ding:
    handler: ding.handler
    events:
      - apigw:
          path: /api/ding

执行 npm run dev 运行项目,点击链接,在链接后面加上 /api/ding 就能访问到该函数。

将完整带有 /api/ding 的链接复制到钉钉开放平台上,具体位置为机器人管理的 开发管理

这里的 服务器出口IP 可以到 IP 查询网站上获取该链接的 IP 地址。

/clouddev-day3/dev.png
完善开发管理

至此,回到钉钉群发送 @机器人的名字 + 消息,可以看到机器人回话并返回发送的消息。

/clouddev-day3/robot.png
机器人对话

问题
  1. 终端可能会报错,不过不用理会(content 变量是发送消息的内容):
1
2
3
TypeError: Cannot read property 'content' of undefined
    at IndexService.ding (/home/admin/workspace/codeup.aliyun.com/5f17df43d248146039337cf0/repo_2020-08-06_2020080600072285/.faas_debug_tmp/dist/index.js:30:41)
    at FaaSStarter.invokeHandler (/home/admin/workspace/codeup.aliyun.com/5f17df43d248146039337cf0/repo_2020-08-06_2020080600072285/node_modules/@midwayjs/faas/dist/starter.js:135:42)
  1. 如果机器人不回话,请检查钉钉开放平台-开发管理-消息接收地址有没有填错,版本管理与发布里的 调试和上线 有没有点击,检查函数文件 index.ts 的代码和 Webhook,确保机器人设置的底部已经生成了 POST 地址和 TOKEN。

/clouddev-day3/config2.png
机器人设置

  1. 保持项目运行,机器人才能一直在线,如有需要可以将项目部署到线上环境。

总结

钉钉群机器人之所以能回话,主要是函数和 Webhook 的作用。

/clouddev-day3/webhook.png
机器人运行逻辑

Webhook 是一个 API 概念,类似触发器。当事件发生时,源网站可以发起一个 HTTP 请求到接口配置的 URL。配置之后,用户可以通过在一个站点触发事件,之后再调用另一个站点的行为。触发的事件可以是"push 代码到远程仓库”,或者"post 一个评论到博客"等等。

利用 Webhook,还可以在钉钉群添加 GitHub 机器人,机器人可以发送代码提交、工单变更、Pull Request 和评论的通知。当然还有更多其它的用途。

对创造营后续内容感兴趣的朋友们记得 关注我 哦~