前言
本文章将介绍从零开始搭建一个通用koa2服务 文章具体配置代码未贴出,可到GitHub中查看
一、技术栈
项目是用使用koa-generator创建项目创建的,列出主要的功能依赖包
点击名称可跳转相关网站
详情可参阅
package.json
-
koa2
-
mongoose(Node原生的MongoDB模块进行了进一步的优化封装)
-
koa-multer(文件上传)
二、详细步骤
本项目用的是yarn管理依赖包,需要安装yarn
1. 使用koa-generator创建项目
npm install -g koa-generator
koa2 myapp//使用koa-generator创建一个 koa service项目
cd myapp //
yarn start //运行
2. 使用mongoDb
请电脑自行安装mongoDb
- 安装
mongoose库
yarn add mongoose
- 连接数据库
//utils/mongodb.js
//引入模块
const mongoose = require('mongoose')
const config = require('../config')
//连接数据库
mongoose.connect(`${config.mongodbUrl}`, {
useNewUrlParser: true,
useUnifiedTopology: true
})
//得到数据库连接句柄
const db = mongoose.connection
//通过数据库连接句柄,监听mongoose数据库成功的事件
db.on('open', function (err) {
if (err) {
console.log('数据库连接失败')
throw err
}
console.log('数据库连接成功')
})
module.exports = {
db
}
//app.js
require('./utils/mongodb')
- 新建models文件夹定义数据结构
在
mongoose中,Schema用于定义文档的结构,相当于一个表的结构定义。
//models/project
/* 定义 page Schema */
const mongoose = require("mongoose");
const prijectSchema = new mongoose.Schema({
id: { type: String }, // 项目id
userId: { type: String }, // 用户id
name: { type: String }, // 项目名字
type: { type: String }, // 项目类型
industry: { type: String }, // 所属行业
config: { type: Object }, // 项目配置
logo: { type: String }, // 项目logo
cover: { type: String }, // 项目封面
pages: { type: Array }, // 页面集合
});
// 创建Model
const ProjectModel = mongoose.model("project", prijectSchema, 'project');
module.exports = ProjectModel
- 新建db文件夹编写mongoose语句
//mongoose 5.x
const { ObjectId } = require('mongodb')
const mongoose = require('mongoose')
const projectModel = mongoose.model('project')
const channel = require('../utils/channel')
const helper = {
// 根据用户id查询所属商城
findAll: id => {
return new Promise((resolve, reject) => {
projectModel.find({ userId: { $eq: id } }, (err, data) => {
if (err) {
reject(err)
} else {
channel.mappingId(data)
resolve(data)
}
})
})
},
}
module.exports = helper
//mongoose 6.x及以上 不再使用回调函数
findAll: id => {
return new Promise((resolve, reject) => {
projectModel.find({ userId: { $eq: id } }).then(data => {
channel.mappingId(data)
resolve(data)
}).catch(err => {
reject(err)
})
})
},
3. 权限校验,安装 jsonwebtoken 库
yarn add jsonwebtoken
- 在需要使用 JWT 的地方,引入
jsonwebtoken库:
const jwt = require('jsonwebtoken');
- 创建 Token
使用 jwt.sign 方法创建 Token:
const token = jwt.sign({ id: user.id }, 'secret', { expiresIn: '1h' });
其中,{ id: user.id } 是要编码的 payload,'secret' 是用于签名的密钥,{ expiresIn: '1h' } 是 Token 的有效期。
- 校验Token
try {
const decoded = jwt.verify(token, 'secret');
const userId = decoded.id;
} catch (err) {
console.error(err);
}
4. 生成路由
在app.js中一个个新增路由太麻烦,我们使用:
koa-compose :提供了一种将多个中间件函数组合成一个中间件的方法
glob :提供了一种方便地匹配文件路径的方法,可以快速地找到需要读取的文件
path: 操作路径
koa-generator已经默认安装
//routes/index.js
const compose = require('koa-compose')
const glob = require('glob')
const { resolve } = require('path')
registerRouter = () => {
let routers = [];
glob.sync(resolve(__dirname, './', '**/*.js'))
.filter(value => (value.indexOf('index.js') === -1))
.map(router => {
routers.push(require(router).routes())
routers.push(require(router).allowedMethods())
})
return compose(routers)
}
module.exports = registerRouter
//app.js
const registerRouter = require('./routes/index')
//...
app.use(registerRouter())
5. 文件上传
koa-multer是一个基于Koa框架的文件上传中间件,它基于multer实现。multer是一个Node.js中间件,用于处理上传的文件数据,它支持单个文件上传、多个文件上传、以及混合上传等功能。
yarn add koa-multer
6. 配置跨域
koa-multer是一个基于Koa框架的文件上传中间件,它基于multer实现。multer是一个Node.js中间件,用于处理上传的文件数据,它支持单个文件上传、多个文件上传、以及混合上传等功能。
yarn add koa2-cors
//app.js
const cors = require('koa2-cors')
//...
app.use(
cors({
credentials: true,
exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'],
allowMethods: ['GET', 'POST', 'DELETE'],
allowHeaders: ['Content-Type', 'Authorization', 'Accept']
})
)
三、项目架构
⊙ 目录结构
调整目录结构:
.
├─ public/ # 模板文件
├─ routes/ # 路由
├─ db/ # sql语句
├─ models/ # 定义 goods Schema
├─ utils/ # 方法库
├─ public/ # 模板文件
├─ routes/ # 路由
├─ config.js # 配置文件
├─ app.js # 入口文件
├─ bin/ # www配置
复制代码
四、运行
运行
yarn dev
五、结尾
后续再增添一些其他功能
最后,未完待续。。。