koa2改造为TS项目【优化版】

借鉴作者  LesStudy. koa2改造为TS项目

在他的基础上,快速搭建自己node微服务。

koa2改造为TS项目【优化版】:koa2改造为TS项目【优化版】

目录

一、安装相关依赖

二、配置package.json

三、配置nodemon.json

四、src目录下app.ts

五、封装链接数据库的文件

六、路由注册

七、控制器

八、业务块

九、src目录下sql文件夹

十、提示,或者错误处理

十一、types目录下ts类型声明文件

十二、引用类型声明

十三、项目开源、大佬们献计献策


一、安装相关依赖

npm install tslint typescript -g
npm install @types/koa-logger @types/koa-router @types/koa-views -g
npm install nodemon  ts-node -g
cnpm i cross-env --save
cnpm i mysql2 --save
cnpm i module-alias --save

二、配置package.json

{ // 其他的我就忽略了
  "scripts": {
    // 启用本地mysql数据库
    "start-test": "cross-env NODE_ENV=test npm run serve ",
    // 启用阿里云的数据库,或者其他数据库
    "start-pro": "cross-env NODE_ENV=pro npm run serve",
  },
  "include": [
      "src/**/*.ts",
      "src/**/*.d.ts"
    ],
    "extension": [
      ".ts"
    ]
  },
  "_moduleAliases": { // 路径简写用到
    "@": "src",
    "@@": "types",
    "@#": "errors"
  }

}

三、配置nodemon.json

{
    "restartable": "rs",
    "verbose": true,
    "watch": [
        "*.js",
        "*.json",
        "*.ts",
        "*.d.ts"
    ],
    "ext": ".ts,.js,.d.ts",
    "ignore": [
        "node_modules/**/node_modules",
        ".git"
    ],
    "execMap": {
        "js": "node --harmony"
    }
}

四、src目录下app.ts

//app.ts
import Koa from 'koa'; // 导入koa
import KoaLogger from 'koa-logger'; // 导入日志
import path from 'path';
const views = require('koa-views');
const app = new Koa(); // 新建一个koa对象
const routerUser = require('./routes/users');
const routerIndex = require('./routes/index');
const logger = KoaLogger();
require('module-alias/register'); // 全局导入路径简写,后面有用到
app.use(logger);
app.on("error", (err:any, ctx:any) => {//捕获异常记录错误日志
  console.log(new Date(), ":", err)
})
// 必须在router上
const staticPath = path.join(__dirname, '../public'); // 静态地址
const viewsPath = path.join(__dirname, '../views'); // 模板地址
app.use(require('koa-static')(staticPath));
app.use(views(viewsPath, {
  extension: 'pug'
}));
app.use(routerIndex.routes());
app.use(routerUser.routes());
 
module.exports = app;

五、封装链接数据库的文件

文件名:db

路径:src/db.ts

const poolm = require('./mysql/' + process.env.NODE_ENV) || {}
const mysql = require("mysql2");
const pool = mysql.createPool(poolm)
function exect(sql: any) {
    //抛出promise对象
    return new Promise((resolve, reject) => {
        pool.query(sql, (err:any, data:any) => {
            //判断
            if (err) {
                reject(err);
            } else {
                resolve(data);
            }
        })
    })
}

module.exports = { exect }

六、路由注册

假设:我要注册查询用户信息的路由

文件名:users

路径:src/routes/users.ts

// 控制器
import USERS_SEEK  from '../controllers/users/users_seek';
// koa2
import Router from 'koa-router';
const router = new Router();
router.prefix('/users');
 
router.get('/', USERS_SEEK.info); // 用户初始化

router.get('/bar', USERS_SEEK.bar); // 用户查询 
 
module.exports = router;

七、控制器

说明:用于处理复杂,或者综合的业务项。可以处理多个业务块,起到复用效果。

例如:关于用户信息的控制器

文件名:users_seek

路径:src/controllers/users/users_seek.ts

class USERS_SEEK {
    async info(ctx: any) {
        ctx.body = "用户初始化中"
    }
    async bar(ctx: any) {
        const { Users } = require("@/service/users") // 数据库的操作
        const users = new Users({});
        ctx.body = await users.bar().then((v: any) => { // 业务逻辑处理
            return v
        });
    }
}

export default new USERS_SEEK

八、业务块

说明: 业务逻辑处理,单个简单的业务

举例:查询用户信息

文件名:users

路径: src/service/users.ts

// 启用数据库
const { exect } = require("@/db");
// SQL
const { SQL } = require("@/sql/users");
const sql = new SQL()
// 错误信息
const { users_errors } = require("@#/sql/users");
const users_error = new users_errors() 
// 用户信息操作
export class Users {
  parm: object
  constructor (parm: object) {
    this.parm = parm;
  }
  async bar() { // 信息处理
    try {
      return await exect(sql.seek_information());
    } catch {
      throw new Error(await users_error.seek_information())
    }
  }
}

九、src目录下sql文件夹

说明:业务中用到大量的sql 语句,代码看起很杂乱,单独创立保存sq语句的文件

举例:查询用户信息

文件名:users

路径:src/sql/users.ts

export class SQL {
  seek_information() { // 查询information表的所有数据
    return 'select * from information'
  }
  delete_information_oidList(oid: number) { // 根据oid删除information表的那一行
    return `select * from information where oid == ${oid}` 
  }
}

十、提示,或者错误处理

说明:系统错误,数据操作错误,或者返回给客户端的提示文案。放在单独的文件下,便于管理

举例:查询用户信息,找不到相应的表

文件名:users

路径:errors/sql/users.ts

引用: 参考第八-业务块

export class users_errors {
  async seek_information() {
    return "用户表查询全部数据出现异常"
  }
  async remove_information_one() {
    return "删除用户表其中一条具体的数据并未成功"
  }
}

十一、types目录下ts类型声明文件

说明: 类型声明,单独存放,整体代码看上去很简洁

举例:链接本地mysql的类型声明文件

文件名:test

路径:types/interface/mysql/test.ts

declare type ColSpanType = string | undefined | null
export interface DATABASE {
  host?: ColSpanType;
  user?: ColSpanType;
  password?: ColSpanType;
  database?: ColSpanType;
  port?: number
}

十二、引用类型声明

举例:链接本地mysql的类型声明文件

文件名:test

路径:src/mysql/test.ts

import { DATABASE } from "@@/interface/mysql/test"

const Database:DATABASE = {
    host: "localhost", //域名
    user: "root", //用户名
    password: "123456", //密码
    database: "admobile_keep", //后面只能是跟数据库名,千万别写表名
    port: 3306, //端口号,默认是3000
}
module.exports = Database

十三、项目开源、大佬们献计献策

 koa2改造为TS项目【优化版】:koa2改造为TS项目【优化版】

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值