基于 Koa.js 的 Node.js MVC 框架

0. 简介

  • 项目名:基于 Koa.js 的 Node.js MVC 框架。
  • 仓库地址:github.com/zhaotoday/k…。
  • 负责人:赵金添@zhaotoday。
  • 特别说明:本项目参考了 Egg.js 框架及 iKcamp 分享的 Koa 视频教程。

1. 运行

1.1. Node 版本

Koa2 使用了 async/await 等新语法,请保证 Node 版本在 7.6 及以上。

1.2. 命令

# 安装依赖
$ npm install

# JS 代码校验
$ npm run eslintfix
$ npm run eslint

# 开发
$ npm run dev

# 启动项目
$ npm start

# 停止项目
$ npm run stop
复制代码

2. 规范

2.1. 目录结构

├─ src                     源码
│  ├─ app                  业务代码
│  │  ├─ controllers       控制器:用于解析用户输入,处理后返回相应的结果
│  │  ├─ models            模型  :用于定义数据模型
│  │  ├─ services          服务  :用于编写业务逻辑层,比如连接数据库,调用第三方接口等
│  │  └─ views             视图  :用于放置模板文件,返回客户端的视图层
│  │
│  ├─ core                 核心代码
│  │  ├─ controller.js     控制器基类
│  │  ├─ model.js          模型基类
│  │  └─ service.js        服务基类
│  │
│  ├─ middlewares          中间件
│  ├─ public               静态资源
│  ├─ router               URL 路由
│  ├─ utils                工具库
│  └─ index.js             入口:用于自定义启动时的初始化工作,比如启动 https,调用中间件、路由等
│  
├─ .eslintrc               eslint 配置文件
├─ nodemon.json            nodemon 配置文件
├─ package.json            npm 配置文件
├─ processes.json          pm2 配置文件
复制代码

2.2. 自定义挂载对象

为了提高开发效率,这里人为的将一些自定义对象挂载到 app 下,用 $ 前缀命名,与 Koa.js 内置对象做区分。

  • app.$helpers:辅助函数
  • app.$model:公用模型对象
  • app.$Service:服务基类
  • app.$Controller:控制器基类
  • app.$models:模型集合
  • app.$services:服务集合
  • app.$controllers:控制器集合

2.3. 示例

2.3.1. 模型

src/app/models/articles.js

module.exports = app => {
  const {ID, SHORT_RELATED_ID, NAME, TITLE, SUBTITLE, DESCRIPTION, CONTENT, PICTURES, ORDER} = app.$model.columns

  return app.$model.define('articles', {
    id: ID,
    category_id: SHORT_RELATED_ID,
    author: NAME,
    title: TITLE,
    subtitle: SUBTITLE,
    description: DESCRIPTION,
    content: CONTENT,
    pictures: PICTURES,
    order: ORDER
  })
}
复制代码

2.3.2. 服务

src/app/services/articles.js

module.exports = app => {
  return class extends app.$Service {
    constructor () {
      super()

      this.model = app.$models.articles
    }
  }
}
复制代码

2.3.3. 控制器

src/app/controllers/articles.js

module.exports = app => {
  const service = app.$services.articles

  return class extends app.$Controller {
    async index (ctx, next) {
      await ctx.render('articles', {
        items: await service.find({offset: 0, limit: 10})
      })
    }
  }
}
复制代码

2.3.4. 视图

src/app/views/articles.ejs

<%- JSON.stringify(items) %>
复制代码

2.3.5. API

src/app/controllers/apis/v1/articles.js

module.exports = app => {
  const service = app.$services.articles

  return class extends app.$Controller {
    async index (ctx, next) {
      ctx.response.body = ctx.send({
        status: 200,
        data: await service.find({offset: 0, limit: 10})
      })
    }
  }
}
复制代码

2.3.6. 路由

src/router/routes/articles.js

module.exports = (app, router) => {
  router.get('/articles', app.$controllers.articles.index)
}
复制代码

3. 参考

3.1. 文档

  • Koa 官网
  • koa 中文网
  • Koa 文档的中文版本
  • Node Koa2 实战
  • Sequelize 文档
  • Sequelize 文档的中文版本
  • EJS 官网
  • EJS 官网中文版
  • EJS 中文文档
  • EJS 模板语言使用
  • PM2 官网

3.2. 文章

  • Koa 框架教程
  • Koa2进阶学习笔记
  • Koa2 之文件上传下载
  • React 服务端渲染与同构
  • koa 实现 jwt 认证
  • PM2实用入门指南
  • Node.js使用Sequelize操作MySQL
  • Sequelize 和 MySQL 对照
  • nginx反向代理原理和配置讲解
  • 前后端分离之JWT用户认证
  • nodemon 基本配置与使用

3.3. 安全

  • 如何防范常见的Web攻击
  • Web安全系列——XSS攻击
  • 如何让前端更安全?——XSS攻击和防御详解
  • 程序猿必读-防范CSRF跨站请求伪造
  • web安全之SQL注入
  • Web安全-XSS
  • 根据白名单过滤 HTML(防止 XSS 攻击)

你可能感兴趣的:(基于 Koa.js 的 Node.js MVC 框架)