✏️
ougege
  • README
  • Docs
    • index
    • Articles
      • AI
        • 体验Chrome AI
        • 体验Cloudflare Workers AI
        • 体验deepseek
      • CSS
        • CSS优化-PurgeCSS
        • 实用效果
        • 开发常用样式
      • Deepin
        • deepin20安装mysql
        • deepin使用tensorflow入门机器学习
        • deepin安装cuda和cuDNN
        • deepin安装lamp
        • deepin安装nvidia驱动
        • deepin安装oh my Zsh
        • deepin安装p7zip
        • deepin换源
        • 安装deepin系统后要做的事
      • Docker
        • CI/CD搭建配置
        • deepin搭建docker环境
        • docker安装和使用gitlab
        • docker搭建nginx+php环境
      • Essay
        • IOS申请邓白氏编码
        • Markdown-Mermaid
        • Markdown Use
        • webview白屏的问题查找和修复
        • 前端开发对接问题和解决办法汇总
        • 国务院机构改革方案
        • 国家级智库
        • 实用网站推荐
        • 常用Markdown数学公式语法
        • 强烈推荐前端要安装的vscode扩展
        • 新建销售计划-页面卡死问题分析
        • 海淘入坑手册
        • 竞品研究
        • 足球知识速成
      • Git
        • GitBook安装和常用命令
        • GitKraken免费版本
        • Git安装和配置
        • Git异常处理
        • Git Worktree使用
        • 前端工程化相关的实用git命令
      • JS
        • ESM模块导出方式对比
        • Emoji多端统一处理
        • JS发布订阅模式
        • JS性能优化
        • JS标准内置对象
        • JS链式调用原理
        • Promise介绍和使用
        • Range的使用
        • Vue+Oauth登录实现
        • Vue实现富文本插入Emoji
        • chrome扩展入门
        • es5新特性
        • es6常用特性
        • es常用片段
        • uniapp使用eslint校验代码
        • 与移动端通信
        • 优秀js库moment
        • 使用vue-socketio
        • 实现一个中间件
        • 小程序webview调试
        • 常用snippets
        • 常用正则
        • 常用的设计模式
        • 微信jssdk封装使用
        • 浏览器宏任务和微任务
        • 浏览器的5种Observer
        • 深入理解赋值、浅拷贝、深拷贝
        • 解析vue指令clickoutside源码
        • 键盘事件与KeyBoardWrapper交互
        • 高德地图常用方法封装
        • 高阶函数片段
      • Network
        • 使用Lighthouse分析前端性能
        • 前后端启用https
        • 宝塔nginx安装ngx_brotli
        • 比较gz与br加载速度
        • 浏览器https提示不安全
        • 浏览器提示HSTS
        • 简单使用tcpdump
        • 静态资源gzip优化
      • Node
        • CommonJS模块导出方式对比
        • Taro command not found 多平台解决方案
        • koa使用和API实现
        • node安装报错Unexpected-token
        • 使用nvm和nrm
        • 使用uniapp给小程序添加云函数
        • 使用verdaccio搭建本地npm仓库
        • 使用vue-cli搭建vue项目
        • 安装Node.js和npm配置
        • 编译成cjs和mjs的思路解析
        • 让你的npmPackage同时支持cjs和mjs
        • 通过GithubAction将内容部署到vps
      • Python
        • Python源管理
        • Python版本管理
        • mitmproxy抓包
        • 微信公众平台开发爬坑经历
      • Shell
        • Ubuntu安装deepin桌面环境
        • Ubuntu安装flatpak软件
        • Ubuntu安装wireshark
        • Ubuntu常见问题汇总
        • dell G3装系统无法识别第二块硬盘
        • linux下virtualbox用gho还原系统
        • mysql常用命令
        • navicat连接一键集成环境的mysql
        • nginx常用命令
        • pm2常用命令
        • virtualbox虚拟机和宿主机互相复制粘贴
        • vps内资源通过mega快传到本地
        • vps报错temporary failure in name resolution
        • vscode修改文件监控数
        • windows+linux双系统引导修复
        • zsh常用插件和命令
        • 一键搭建ChatGPT web版
        • 使用V2ray,CloudFlare Warp解锁GPT
        • 使用vscode进行java开发
        • 利用zx和SSHKey发布代码到服务器
        • 反爬虫一些方案总结和尝试
        • 安装1Panel
        • 安装Bt面板
        • 安装Ubuntu22.04后要做的事
        • 无显示器linux设置默认分辨率
        • 特别实用的shell命令
        • 解决linux安装xmind缺少依赖报错
      • Standards
        • CSS格式化之stylelint
        • CSS规范
        • HTML规范
        • JS规范
        • commit规范
        • 使用husky+commitlint规范代码提交
        • 使用semantic-release自动管理版本号
        • 命名规范
        • 图片规范
        • 版本编号规范
      • Wall
        • 科学上网-Cloudflare-Pages
        • 科学上网-Cloudflare-Warp
        • 科学上网-Geph
        • 科学上网-RackNerd
        • 科学上网-Slicehosting
        • 科学上网-Surfshark
        • 科学上网-Tor
        • 科学上网-XX-NET
        • 科学上网-heroku
        • 科学上网-shadowsock
        • 科学上网-v2ray使用
        • 科学上网-v2ray搭建
        • 科学上网-浏览器代理
        • 科学上网-让终端走代理
      • Windows
        • SourceTree破解免登录(windows版)
        • git bash交互提示符不工作
        • nexus 7 2013 wifi 刷机
        • tree命令生成文件目录
        • 利用charles抓包app
        • 安装Openssl
        • 安装msi文件报错2503和2502
        • 神器vimium使用说明
        • 自用host
        • 解决win10扩展出来的屏幕模糊
        • 解决安装Adobe Air时发生错误
    • Snippets
      • zsh
        • docker
        • extract
        • git-commit
        • git
        • mysql-macports
        • npm
        • nvm
        • pip
        • pm2
        • systemd
        • ubuntu
        • vscode
Powered by GitBook
On this page
  • 前言
  • 工具
  • 后端开发过程
  • 前端开发过程
  • 思考
  • 参考

Was this helpful?

  1. Docs
  2. Articles
  3. Node

koa使用和API实现

PreviousTaro command not found 多平台解决方案Nextnode安装报错Unexpected-token

Last updated 10 months ago

Was this helpful?

前言

记录一个小项目用 koa 实现前后端的过程

项目地址: https://github.com/MuYi086/koaDemo

工具

开发过程中用到的工具包括但不限于: vscode, mysqlWorkbench, phpStudy, vue, koa, mysql

后端开发过程

  1. 搭建 koa 项目

    # 全局安装koa
    npm i koa -g
    # 全局安装koa2项目生成器
    npm i koa-generator -g
    # 创建项目
    koa2 koaDemo
    # 安装依赖
    cd ./koaDemo && npm i
  2. 丰富项目骨架

    # 安装sequelize, mysql, mysql2
    npm i sequelize mysql mysql2 --save
    # 解决跨域
    npm i koa-cors --save
    # app.js加入koa-cors的引用
    const cors = require('koa-cors')
    app.use(cors())
  3. 根目录创建 config 目录, config 目录中创建 db.js

    const Sequelize = require('sequelize')
    const user = {dbName: 'koa', dbUserName: 'koa', password: 'koa'}
    const sequelize = new Sequelize(user.dbName, user.dbUserName, user.password, {
        host: 'localhost',
        dialect: 'mysql',
        operatorsAliases: false,
        dialectOptions: {
            // 字符集
            charset: 'utf8mb4',
            collate: 'utf8mb4_unicode_ci',
            supportBigNumbers: true,
            bigNumberStrings: true
        },
        pool: {
            max: 5,
            min: 0,
            acquire: 30000,
            idle: 10000
        },
        timezone: '+8:00' // 东八区
    });
    module.exports = {sequelize}
  4. 创建 schema 目录,用于放置数据表模型实例,创建 forward.js

    const moment = require('moment')
    module.exports = function(sequelize, DataTypes) {
        return sequelize.define('forward', {
            name: {
                type: DataTypes.STRING,
                allowNull: false,
                field:'name'
            },
            id: {
                type: DataTypes.INTEGER,
                allowNull: false,
                field: 'id'
            },
            price: {
                type: DataTypes.INTEGER,
                allowNull: false,
                field: 'price'
            },
            deposit: {
                type: DataTypes.INTEGER,
                allowNull: false,
                field: 'deposit'
            },
            uuid: {
                type: DataTypes.INTEGER,
                primaryKey: true,
                allowNull: true,
                autoIncrement: true
            }
        }, {
            freezeTableName: true
        })
    }
  5. 创建 modules 目录, 用于放置实体模型, 创建 forward.js

    // 引入mysql配置文件
    const db = require('../config/db')
    const Sequelize = db.sequelize
    // 引入数据表模型
    const ForWard = Sequelize.import('../schema/forward')
    ForWard.sync({force: false}) // 自动创建表
    class ForWardModel {
        /**
        * 创建合约模型
        * @param data
        * @returns {Promise<*>}
        */
        static async createForWard(data) {
            return await ForWard.create({
                name: data.name,
                id: data.id,
                price: data.price,
                deposit: data.deposit
            })
        }
    
        /**
        * 查询合约列表
        * @param id 文章id
        * @returns {Promise<Model}
        */
        static async getForWardList(id) {
            return await ForWard.findOne({
                where: {
                    id
                }
            })
        }
    }
    
    module.exports = ForWardModel
  6. 创建 controller 目录,用于放置控制器, 创建 forward.js

    const ForWardModel = require('../modules/forward')
    class forWardController {
        /**
        * 创建合约
        * @param ctx
        * @returns {Promise.<void>}
        */
        static async create(ctx) {
            // 接受客户端
            let req = ctx.request.body
            if(req.name && req.id && req.price && req.deposit) {
                try {
                    // 创建合约模型
                    const ret = await ForWardModel.createForWard(req)
                    // 使用刚刚创建的id查询合约列表,且返回合约信息
                    const data = await ForWardModel.getForWardList(ret.id)
    
                    ctx.response.status = 200
                    ctx.body = {
                        code: 200, 
                        msg: '创建合约成功',
                        data
                    }
                } catch(err) {
                    ctx.response.status = 412
                    ctx.body = {
                        code: 412,
                        msg: '创建合约失败',
                        data: err
                    }
                }
            } else {
                ctx.response.status = 416
                ctx.body = {
                    code: 200,
                    msg: '参数不全'
                }
            }
        }
    
        /**
        * 获取合约详情
        * @param ctx
        * @returns {Promise.<void>}
        */
        static async detail(ctx) {
            let id = ctx.params.id
            if (id) {
                try {
                    // 查询合约详情模型
                    let data = await ForWardModel.getForWardList(id)
                    ctx.response.status = 200
                    ctx.body = {
                        code: 200,
                        msg: '查询成功',
                        data
                    }
                } catch (err) {
                    ctx.response.status = 412
                    ctx.body = {
                        code: 412,
                        msg: '查询失败',
                        data: err
                    }
                }
            } else {
                ctx.response.status = 416
                ctx.body = {
                    code: 416,
                    msg: '合约id必须要传'
                }
            }
        }
    }
    
    module.exports = forWardController
  7. routes 目录下 index.js 增加路由

    const ForWardController = require('../controllers/forward')
    
    // 创建合约
    router.post('/forward/create', ForWardController.create)
    // 获取合约详情
    router.get('/forward/:id', ForWardController.detail)
  8. 启动服务

    npm start

前端开发过程

  1. 利用 vue-cli 新建一个项目,安装依赖

    vue init webpack koafront
    cd ./koafront && npm i
  2. 利用 proxyTable 设置跨域

    proxyTable: {
        '/api': {
            target: "http://localhost:3000",
            changeOrigin: true,
            pathRewrite: {
            '^/api': ""
            }
        }
    },
  3. 使用 axios 请求

    axios.get('api/forward/101').then(function (res) {
        console.log(res)
    }).catch(function (error) {
        console.log(error)
    })
  4. 使用 scss 预处理器

    # 安装node-sass、sass-loader、style-loader
    # 注意这里sass-loader安装是尝试过的可用版本,最新版本会抛错
    npm i sass-loader@7.3.1 --save-dev
    npm i node-sass style-loader --save-dev
  5. 配置 build 目录下的 webpack.base.conf.js 文件

    // 在rules规则加上如下:
    {
        test: /\.scss$ /,
        loaders: ['style', 'css', 'sass']
    },
  6. 安装 sass-resource-loader 来全局引入

    npm i sass-resources-loader --save-dev
  7. 修改 build 中的 utils.js 配置

    // 将
    scss: generateLoaders('sass'),
    // 替换为
    scss: generateLoaders('sass').concat(
      {
        loader: 'sass-resources-loader',
        options: {
          // scss全局文件路径
          resources: path.resolve(__dirname, '../src/assets/css/site.scss')
        }
      }
    ),

思考

  1. 使用 nginx 代理实现跨域

参考

利用postman测试
koa官方文档
koa2从搭建项目到实现API
使用koa+mysql实现一个完整的项目
前后端合一使用教程
在vue-cli 2.x中全局使用scss文件,以及相关报错