后端部分主要用 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 中获取到我们预设的用户数据。
源码
本文如有未尽之处请参见源码