后端加亿点料 | Day 6

224 阅读2分钟

后端部分主要用 Koa + Prisma + MySQL,主打一个轻量便捷。

在前述的文章中,已经介绍了 Koa 的一些基本情况,接下来,看看如何将 Prisma 加入到项目中:

首先看看依赖:

{
  "dependencies": {
    "@prisma/client": "^5.21.1"
  },
  "devDependencies": {
    "prisma": "^5.21.1",
  }
}

首先保证本地安装了 MySQL ,拼装一下数据库的连接字符串:

DATABASE_URL="mysql://<username>:<password>@<url>:<port>/<database>?schema=public"

然后将上面的链接添加到 server 下的 .env 文件中。

注意:数据库链接字符串中包含链接数据库的敏感信息,请不要将 .env 文件纳入版本管理,以防敏感信息泄露。

然后,初始化 prisma :

npx prisma init

初始化后,会在 server 下生成一个 prisma 的文件夹,修改 schema.prisma 文件:

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

model User {
  id       String  @id @default(uuid()) @db.Char(36)
  password String  @db.VarChar(255)
  username String  @unique
  phone    String  @unique
  email    String  @unique
  nickname String?
}

然后,就可以将定义好的 model 同步到数据库:

npx prisma migrate dev --name init

然后再生成一下 prisma 的客户端:

npx prisma generate

紧接着通过 seeds.js 创建一些基础数据

import { PrismaClient } from '@prisma/client'

async function createData() {
  const prisma = new PrismaClient()
  const newUser = await prisma.user.create({
    data: {
      username: 'admin',
      email: 'admin@admin.com',
      phone: '13260660000',
      password: '123456',
    },
  })
  console.log(newUser)
}

createData()

至此,prisma 的配置也已经完成。

最后,我们创建一些 controllers:

import { prisma } from '~/prisma/client'

export async function getUserInfo(ctx, next) {
  const user = await prisma.user.findUnique({
    where: {
      id,
    },
    select: {
      id: true,
      username: true,
      email: true,
      phone: true,
    },
  })

  ctx.status = 200
  ctx.body = {
    code: 200,
    data: user,
    message: 'ok',
  }

  await next()
}

export default {
  'get /user/info': {
    handler: getUserInfo,
    whiteList: false,
  },
}

对于 controller 的中间件:

import { log } from '@/utils'
import Router from '@koa/router'

const modules = import.meta.glob('./modules/*.js', { eager: true })

const controllers = Object.keys(modules)
  .map(key => modules[key].default)
  .reduce((acc, item) => {
    acc = { ...acc, ...item }
    return acc
  }, {})

export default function setupRouters(app) {
  const router = new Router()

  Object.keys(controllers).forEach((key) => {
    const [method, url] = key.split(' ')
    router[method.toLowerCase()](`/api${url}`, controllers[key].handler)
    log(`↑ ${method.toUpperCase()} /api${url}`)
  })

  app.use(router.routes())
  app.use(router.allowedMethods())
}

可以将 setupRouters 导出到 main.js 中进行配置,当我们启动后端程序,就可以在 http://localhost:300/api/user/info 中获取到我们预设的用户数据。

源码

本文如有未尽之处请参见源码