从零开始搭建koa2+mongo服务

235 阅读2分钟

前言

本文章将介绍从零开始搭建一个通用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

五、结尾

后续再增添一些其他功能

最后,未完待续。。。