借鉴作者 LesStudy. koa2改造为TS项目
在他的基础上,快速搭建自己node微服务。
koa2改造为TS项目【优化版】:koa2改造为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项目【优化版】