目前工作终于不是太忙,可以闲下心做一点新东西,作为一个前端开发者,综合考虑了 express,koa2,egg,nest 等后端框架,最后决定使用 Nest + 腾讯云 Serverless 做一个后端小项目用来入门 nest+typeorm+serverless, 此系列将持续更新,记录过程中遇到的问题及经验。

# 安装 Nest 框架与腾讯云 Serverless Framework

# 安装 Nest

h
$ npm i -g @nestjs/cli
$ nest new manager

# 安装 Serverless Framework

h
$ npm install -g serverless

# 在项目根目录创建.env 文件及 serverless.yml 文件

h
$ touch .env
$ touch serverless.yml

.env 文件主要包含腾讯云 secretKey 和一些项目的全局配置

n
# .env
TENCENT_SECRET_ID=AKIDPxxxxxxxxxxxxxxxxxxxxxpNffOq1
TENCENT_SECRET_KEY=wb091xxxxxxxxxxxxxxxxxxxxxfW7RVI
# 地域可用区配置
REGION=ap-shanghai
ZONE=ap-shanghai-2

serverless.yml 文件主要包含云函数及网络相关配置 以下是我的配置

l
app: manager
stage: dev
component: http
name: manager
inputs:
  src:
    dist: ./
    hook: npm run build
    exclude:
      - .env
      - node_modules
    src: ./
  faas:
    runtime: Nodejs16.13
    framework: nestjs
    name: '${name}-${stage}'
    eip: false
    timeout: 3
    memorySize: 512
    tags: []
    environments: 
    - key: MYSQL_HOST
      value: 10.0.0.5
    - key: MYSQL_USER
      value: serverless
    - key: MYSQL_DATABASE
      value: manager
    - key: MYSQL_PASSWORD
      value: managerpassword
    vpc: # 私有网络配置
      vpcId: 'vpc-b5776770'
      subnetId: 'subnet-asy3z93z'
    layers:
      - name: manager-layer
        version: 1
  apigw:
    protocols:
      - http
      - https
    timeout: 60
    customDomains: []
  region: ${env:REGION}

这里是 《component 为 http 的 yaml 文件配置项

# 使用 Serverless Framework 部署

首先需要对项目进行一些修改以满足腾讯云 Serverless 的要求

编辑 package.json 添加一些 script

n
{
  "name": "manager",
  "version": "0.0.1",
  "description": "",
  "author": "",
  "private": true,
  "license": "MIT",
  "scripts": {
    "prebuild": "rimraf dist",
    "build": "nest build",
    "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
    "start": "nest start",
    "start:dev": "nest start --watch",
    "dev": "nest start --watch",
    "start:debug": "nest start --debug --watch",
    "start:prod": "node dist/main",
    "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
    "test": "jest",
    "test:watch": "jest --watch",
    "test:cov": "jest --coverage",
    "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
    "test:e2e": "jest --config ./test/jest-e2e.json",
    "deploy": "sls deploy",
    "remove": "sls remove",
    "info": "sls info"
  },
  "dependencies": {
    "@nestjs/common": "^9.0.11",
    "@nestjs/core": "^9.0.11",
    "@nestjs/platform-express": "^9.0.11",
    "reflect-metadata": "^0.1.13",
    "rimraf": "^3.0.2",
    "rxjs": "^7.2.0"
  },
  "devDependencies": {
    "@nestjs/cli": "^9.0.0",
    "@nestjs/schematics": "^9.0.0",
    "@nestjs/testing": "^9.0.0",
    "@types/express": "^4.17.13",
    "@types/jest": "28.1.4",
    "@types/node": "^16.0.0",
    "@types/supertest": "^2.0.11",
    "@typescript-eslint/eslint-plugin": "^5.0.0",
    "@typescript-eslint/parser": "^5.0.0",
    "eslint": "^8.0.1",
    "eslint-config-prettier": "^8.3.0",
    "eslint-plugin-prettier": "^4.0.0",
    "jest": "28.1.2",
    "prettier": "^2.3.2",
    "source-map-support": "^0.5.20",
    "supertest": "^6.1.3",
    "ts-jest": "28.0.5",
    "ts-loader": "^9.2.3",
    "ts-node": "^10.0.0",
    "tsconfig-paths": "4.0.0",
    "typescript": "^4.3.5"
  },
  "jest": {
    "moduleFileExtensions": [
      "js",
      "json",
      "ts"
    ],
    "rootDir": "src",
    "testRegex": ".*\\.spec\\.ts$",
    "transform": {
      "^.+\\.(t|j)s$": "ts-jest"
    },
    "collectCoverageFrom": [
      "**/*.(t|j)s"
    ],
    "coverageDirectory": "../coverage",
    "testEnvironment": "node"
  }
}

修改 main.ts 将监听 3000 端口改为监听 9000 端口

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(9000);
  console.log("server listen on 9000!");
}
bootstrap();

创建启动文件 scf_bootstrap

h
#!/bin/bash
SERVERLESS=1 /var/lang/node16/bin/node ./dist/main.js

最后执行 sls deploy 进行部署项目,大概 50 多秒就部署完成了,取决于网络速度

h
$ sls deploy
serverless ⚡tencent
Action: "deploy" - Stage: "dev" - App: "manager" - Name: "manager"
apigw:
  apiList:
    -
      apiId:           api-l764cd57
      apiName:         http_api
      authType:        NONE
      businessType:    NORMAL
      created:         true
      internalDomain:
      isBase64Encoded: false
      method:          ANY
      path:            /
      url:             https://service-mlmh4ts7-1252902543.sh.apigw.tencentcs.com/release/
  environment: release
  id:          service-mlmh4ts7
  subDomain:   service-mlmh4ts7-1252902543.sh.apigw.tencentcs.com
  url:         https://service-mlmh4ts7-1252902543.sh.apigw.tencentcs.com/release/
faas:
  name:      manager-dev
  namespace: default
  runtime:   Nodejs16.13
  type:      web
region:                ap-shanghai
sourceCodeDownloadUrl: https://sls-app-code-prod-1300862921.cos.ap-guangzhou.myqcloud.com/1252902543%2Fdev%2Fmanager%2Fmanager%2Fsource.zip?sign=q-sign-algorithm%3Dsha1%26q-ak%3DAKIDfBS1NUcuMcgVSTqzRhiX6lBUbY4KeLXW%26q-sign-time%3D1661312847%3B1661316447%26q-key-time%3D1661312847%3B1661316447%26q-header-list%3Dhost%26q-url-param-list%3D%26q-signature%3D600f78221ddc7718eea6d5959f3049fd918699ec
应用控制台: https://serverless.cloud.tencent.com/apps/manager/manager/dev

打开浏览器访问 https://service-mlmh4ts7-1252902543.sh.apigw.tencentcs.com
如期看到 Hello World!
至此,一个最基本的 Nest 框架就被我们使用腾讯云 Serverless 部署成功了!

请我喝杯[咖啡]~( ̄▽ ̄)~*

一个放羊娃 微信支付

微信支付

一个放羊娃 支付宝

支付宝