ts使用装饰器简单封装node serve 和 type orm

最近在学习ts的过程中遇到了装饰器这个东西。这个东西非常好用,可以动态的给类添加一些属性、方法。或是拿到类的属性和方法。
在学习的过程中了解到aop切面编程等一些思想。关于ts 的装饰器相关的介绍我不多讲,具体细节在ts的官网就能查到。

目录结构

src
├── decorator
│   └── server.ts
├── main.ts
├── modules
    └── Muser.ts

装饰器使用

// mian.ts
import { Db, Get } from "./decorator/server";
import { ServerResponse } from "http";

// @Db() 可选的typeorm的注入
//seerver 的 主类
class Main {
  @Get("/") //给ha 函数 添加 `Get` 装饰器,参数是对应匹配的路由,这样对应的路由请求就会打到这个函数上。
  ha(req, res: ServerResponse) {
    res.write("okok");
  }

  @Get("/asd")//可以添加多个
  hb(req, res: ServerResponse) {
    res.write("asd");
  }
}

请求

GET http://localhost:3000/asd
Accept: application/json


HTTP/1.1 200 OK
Date: Tue, 18 Aug 2020 01:41:01 GMT
Connection: keep-alive
Transfer-Encoding: chunked

asd

Response code: 200 (OK); Time: 21ms; Content length: 3 bytes

装饰器实现

//modules/server.ts
import http, { IncomingMessage, Server, ServerResponse } from "http";
import url from "url";
import "reflect-metadata";
import { createConnection } from "typeorm";
import { Muser } from "../modules/Muser";
//使用map的数据结构将每个路由对应的处理函数相互关联起来
const Router = new Map<string, Function>();
let _server: Server = http.createServer();
_server.listen(3000, () => {
  console.log(`server is listen on ${3000}`);
});
//当服务有请求的时候会执行此回调函数
_server.on("request", (req: IncomingMessage, res: ServerResponse) => {
  console.log(req.url);//拿到请求的地址
  const _url = url.parse(req.url);//使用url模块将url解析
  //判断路由名称是否在路由map中注册,如果已经注册过,则调用注册的处理函数
  if (Router.has(_url.pathname)) Router.get(_url.pathname)(req, res);
  else res.write("the server is not found");//没有就提示服务未找到
  res.end();
});
/*
Get的装饰器工厂
path:要注册的路由路径
return:函数装饰器
*/
export function Get(path: string) {
  return (cons: any, name: string) => {
    //cons 是被装饰的函数所在的对象,name则为被装饰的函数的名称,使用cons[name] 就能拿到对应的函数的引用。
    Router.set(path, cons[name]);//将路径和处理函数关联起来
  };
}
//typeorm的封装
export function Db() {
  return <T extends { new(...ares: any[]): {} }>(constructor: T) => {
    createConnection({
      type: "mysql",
      host: "localhost",
      port: 3306,
      username: "root",
      password: "",
      database: "test",
      entities: [Muser],
      synchronize: true,
      logging: false,
    }).then(connection => {
      console.log("连接成功");
      return new class extends constructor {
        db = connection;//注入db属性
      };
    }).catch(error => console.log(error));
  };
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,你想了解如何使用 Flask 和 PyMySQL 进行封装,但是不使用 ORM,对吗? 首先,你需要安装 Flask 和 PyMySQL: ``` pip install Flask pip install PyMySQL ``` 接下来,你可以创建一个名为 `db.py` 的模块,其中包含以下内容: ```python import pymysql.cursors def get_db(): return pymysql.connect( host='localhost', user='your_user_name', password='your_password', db='your_database_name', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor ) def query_db(query, args=(), one=False): conn = get_db() cur = conn.cursor() cur.execute(query, args) rv = cur.fetchall() cur.close() conn.close() return (rv[0] if rv else None) if one else rv def insert_db(table, fields=(), values=()): conn = get_db() cur = conn.cursor() query = "INSERT INTO {} ({}) VALUES ({})".format(table, ', '.join(fields), ', '.join(['%s' for i in range(len(values))])) cur.execute(query, values) conn.commit() cur.close() conn.close() ``` 这个 `db.py` 模块定义了三个主要的函数: - `get_db()`:用于获取一个数据库连接对象。 - `query_db()`:用于执行 SQL 查询,并返回结果。 - `insert_db()`:用于向数据库中插入数据。 现在,你可以在 Flask 应用程序中使用这些函数来访问数据库。例如,下面是一个简单的 Flask 应用程序,它使用 `query_db()` 函数从数据库中获取一些数据: ```python from flask import Flask, jsonify from db import query_db app = Flask(__name__) @app.route('/users') def get_users(): users = query_db('SELECT * FROM users') return jsonify(users) if __name__ == '__main__': app.run() ``` 在这个例子中,我们使用 Flask 的 `jsonify()` 函数将查询结果转换为 JSON 格式,并返回给客户端。 希望这可以回答你的问题。如果你还有其他问题,请随时问我。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值