开发函数
初始化代码
让我们来开发第一个纯 HTTP 函数,来尝试将它部署到云环境。
执行 npm init midway,选择 faas 脚手架。
目录结构
以下就是一个函数的最精简的结构,核心会包括一个 f.yml 标准化函数文件,以及 TypeScript 的项目结构。
.
├── f.yml           	# 标准化 spec 文件
├── package.json    	# 项目依赖
├── src
│   └── function
│       └── hello.ts	## 函数文件
└── tsconfig.json
我们来简单了解一下文件内容。
f.yml函数定义文件tsconfig.jsonTypeScript 配置文件src函数源码目录src/function/hello.ts示例函数文件
我们将函数放在 function目录下,是为了更好的和其他类型的代码分开。
函数文件
我们首先来看看函数文件,传统的函数是一个 function ,为了更符合 midway 体系,以及使用我们的依赖注入,这里将它变成了 Class。
通过 @ServerlessTrigger 装饰器,我们将方法标注为一个 HTTP 接口,并且标示 path 和 method 属性。
import { Provide, Inject, ServerlessTrigger, ServerlessTriggerType, Query } from '@midwayjs/core';
import { Context } from '@midwayjs/faas';
@Provide()
export class HelloHTTPService {
  @Inject()
  ctx: Context;
  @ServerlessTrigger(ServerlessTriggerType.HTTP, {
    path: '/',
    method: 'get',
  })
  async handleHTTPEvent(@Query() name = 'midway') {
    return `hello ${name}`;
  }
}
除了触发器外,我们还可以使用 @ServerlessFunction 装饰器描述函数层面的元信息,比如函数名,并发度等等。
这样,当我们在一个函数上,使用多个触发器时,就可以这样设置。
import { Provide, Inject, ServerlessFunction, ServerlessTrigger, ServerlessTriggerType } from '@midwayjs/core';
import { Context } from '@midwayjs/faas';
@Provide()
export class HelloServerlessService {
  @Inject()
  ctx: Context;
  // 一个函数多个触发器
  @ServerlessFunction({
    functionName: 'abcde',
  })
  @ServerlessTrigger(ServerlessTriggerType.TIMER, {
    name: 'timer'
  })
  async handleTimerEvent() {
    // TODO
  }
}
警告
注意,有些平台无法将不同类型的触发器放在同一个函数中,比如阿里云规定,HTTP 触发器和其他触发器不能同时在一个函数生效。
函数 定义文件
f.yml 是框架识别函数信息的文件,内容如下。
provider:
  name: aliyun  # 发布的平台,这里是阿里云
  starter: '@midwayjs/fc-starter'
这里的 @midwayjs/fc-starter 就是适配 aliyun 函数的适配器。