typescript-koa-postgresql 实现一个简单的rest风格服务器 —— 连接 postgresql 数据库...

接上一篇,这里使用 sequelize 来连接 postgresql 数据库

1、安装 sequelize,数据库驱动 pg

yarn add sequelize sequelize-typescript pg reflect-metadata

2、新建配置文件夹 conf 及 配置文件 db.conf.ts

/*** @name: 数据库配置* @param : undefined* @return : undefined*/ 
export const dbConfig = {host: 'localhost',database: 'demo',dialect: 'postgres',username: 'postgres',password: '123456'
}

3、连接数据库,新建文件夹 db 及 配置文件 db.ts

 1 /*
 2  * @Description: 数据库连接类
 3  */
 4 
 5 import * as path from 'path'
 6 import { Sequelize } from 'sequelize-typescript'
 7 import { dbConfig } from '../conf/db.conf'
 8 
 9 class DbContext {
10   private sequelize: Sequelize
11   constructor() {
12     const { host, database, dialect, username, password } = dbConfig
13     this.sequelize = new Sequelize({
14       host: host,
15       database: database,
16       dialect: dialect,
17       username: username,
18       password: password,
19       define: {
20         timestamps: true,  //开启时间戳 create_at delete_at update_at
21         paranoid: true,    //开启假删除
22         underscored: true, //下划线
23         charset: 'utf8',
24         freezeTableName: true //固定表名为单数  默认表名是xxxs
25       },
26       pool: {
27         max: 10,
28         min: 0,
29         acquire: 30000,
30         idle: 10000
31       },
32       timezone: '+08:00',
33       modelPaths: [path.resolve(__dirname, `./models`)]
34     })
35     this.sequelize.sync()
36   }
37   init(): Boolean {
38     return !!this.sequelize
39   }
40   getInstance(): Sequelize {
41     return this.sequelize
42   }
43   isInit(): Boolean {
44     return !!this.sequelize
45   }
46 }
47 export const dbContext = new DbContext()

4、数据库实体类,新建文件夹 models 及文件 user.ts

 1 /*
 2  * @Description: 数据库实体类
 3  */
 4 
 5 import { Table, Column, Model } from 'sequelize-typescript'
 6 
 7 @Table({
 8   tableName: 'user'
 9 })
10 export default class User extends Model<User> {
11   @Column({
12     comment: '自增ID',
13     primaryKey: true,
14     autoIncrement: true,
15   })
16   id: number
17 
18   @Column
19   username: string
20 
21   @Column
22   password: string
23 }

 5、编写业务逻辑接口,在 src 目录下新建文件夹 dao、service,在 dao 目录下新建 UserDao.ts 及子目录  impl,在 service  目录下新建 UserService.ts 及子目录  impl

 1 /*
 2  * @Description: 数据库表操作基础接口 UserDao.ts 
 3  */
 4 export interface UserDao {
 5   /**
 6    * @name: 查询
 7    * @param : 
 8    * @return : Array<User>
 9    */
10   findAll();
11   /**
12    * @name: 查询
13    * @param : 
14    * @return : Array<User>
15    */
16   findByName(username:string);
17   /**
18    * @name: 新增
19    * @param : undefined
20    * @return : undefined
21    */
22   create(entity:UserInfo);
23 
24   /**
25    * @name: 删除
26    * @param : undefined
27    * @return : undefined
28    */
29   delete(id:number);
30 }
31 export interface UserInfo {
32   username:string;
33   password:string;
34 }
 1 /*
 2  * @Description: service接口  UserService.ts
 3  * @version: 
 4  */
 5 
 6 export interface UserService{
 7   /**
 8    * @name: 查询
 9    * @param : undefined
10    * @return : undefined
11    */
12   findAll();
13   
14   /**
15    * @name: 查询
16    * @param : undefined
17    * @return : undefined
18    */
19   findByName(username:string);
20 
21   /**
22    * @name: 新增
23    * @param : undefined
24    * @return : undefined
25    */
26   create(username:string,password:string);
27 
28   /**
29    * @name: 删除
30    * @param : undefined
31    * @return : undefined
32    */
33   delete(id:String);
34 }

6、编写业务逻辑实现类 UserDaoImpl.ts、UserServiceImpl.ts

 1 /*
 2  * @Description: 数据库表操作基础实现类 UserDaoImpl.ts
 3  */
 4 
 5 import { dbContext } from '../../db/db'
 6 import { UserDao, UserInfo } from '../UserDao';
 7 import User from '../../db/models/user';
 8 
 9 export class UserDaoImpl implements UserDao{
10   constructor(){
11     dbContext.init();
12   }
13   /**
14    * @name: 查询
15    * @param : undefined
16    * @return : undefined
17    */
18   public async findAll(){
19     const results = await User.findAll({
20       raw: true
21     })
22     return results;
23   } 
24   
25    /**
26    * @name: 查询
27    * @param : undefined
28    * @return : undefined
29    */
30   public async findByName(username:string){
31     const results = await User.findOne({
32       where:{
33         username:username
34       }
35     })
36     return results;
37   } 
38 
39   /**
40    * @name: 新增
41    * @param : entity
42    * @return : undefined
43    */
44   public async create(entity:UserInfo) {
45     const results = await User.create(entity)
46     return results;
47   }
48   
49    /**
50    * @name: 删除
51    * @param : undefined
52    * @return : undefined
53    */
54   public async delete(id: number) {
55     const results = await User.destroy({
56       where:{
57           id:{
58             $eq:id
59           }
60       }
61     });
62     return results;
63   }
64 } 
 1 import { UserService } from "../UserService";
 2 import { UserDao } from "../../dao/UserDao";
 3 import { UserDaoImpl } from "../../dao/impl/UserDaoImpl";
 4 
 5 /*
 6  * @Description: service实现类 UserServiceImpl.ts
 7  */
 8 
 9 
10 export class UserServiceImpl implements UserService{
11   private userDao:UserDao;
12 
13   constructor(){
14     this.userDao = new UserDaoImpl();
15   }
16 
17   /**
18    * @name: 查询
19    * @param : undefined
20    * @return : undefined
21    */
22   public findAll() {
23     return this.userDao.findAll();
24   } 
25   /**
26    * @name: 查询
27    * @param : undefined
28    * @return : undefined
29    */
30   public findByName(username:string) {
31     return this.userDao.findByName(username);
32   } 
33   /**
34    * @name: 新增
35    * @param : entity
36    * @return : undefined
37    */
38   public create(username: string, password: string) {
39     return this.userDao.create({username,password});
40   }
41 
42   /**
43    * @name: 删除
44    * @param : undefined
45    * @return : undefined
46    */
47   public delete(id: String) {
48     return this.userDao.delete(~~id);
49   }
50  
51 } 

 7、查看成果,修改 router/index.ts

 1 /*
 2  * @Description: 后台路由组件
 3  * @version: 0.1.0
 4  */
 5 import * as Router from 'koa-router';
 6 import { UserInfo } from '../dao/UserDao';
 7 import { UserService } from '../service/UserService';
 8 import { UserServiceImpl } from '../service/impl/UserServiceImpl';
 9 
10 const router = new Router();
11 const userService:UserService =new UserServiceImpl();
12 
13 router.get('/*', async (ctx) => {
14   ctx.body = await userService.findAll();
15 })
16 
17 export { router }

8、浏览器输入 http://localhost:8080

 

至此连接数据库完成

 

目录结构:

转载于:https://www.cnblogs.com/lifefriend/p/10025469.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248910.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SmartGit使用教程

说明 官网的客户端是命令行形式的&#xff0c;有兴趣可以去了解下。这里针对图形界面的smartgit做一个使用说明。 软件下载和安装 下载地址[2016.12.16测试可以] 按需选择,如果不知道自己电脑是什么系统的&#xff0c;那我没话说了https://www.syntevo.com/smartgit/ 安装 …

jquery 下拉框 select2 运用 笔记

1,添加select2 样式 参考&#xff08;https://select2.org/ &#xff09; 2,Html: <select id"txtType" name"Type" class"form-control select2" multiple"multiple"> </select> 3,jquery section scripts{ $(documen…

获取浏览器屏幕高度(js,jq) - 进击的小牛牛 - 博客园

javascript IE中&#xff1a; document.body.clientWidth > BODY对象宽度 document.body.clientHeight > BODY对象高度 document.documentElement.clientWidth > 可见区域宽度 document.documentElement.clientHeight > 可见区域高度 FireFox中&#xff1a; docum…

第一个爬虫和测试

Python测试函数的方法之一是用&#xff1a;try……except def gameover(a,b):if a>10 and b>10 and abs(a-b)2:return Trueif (a>11 and b<11) or (a<11 and b>11):return Truereturn False try:agameover(10,11)print(a) except:print("Error") g…

JS组件系列——Bootstrap 树控件使用经验分享 - 懒得安分 - 博客园

前言&#xff1a;很多时候我们在项目中需要用到树&#xff0c;有些树仅仅是展示层级关系&#xff0c;有些树是为了展示和编辑层级关系&#xff0c;还有些树是为了选中项然后其他地方调用选中项。不管怎么样&#xff0c;树控件都是很多项目里面不可或缺的组件之一。今天&#xf…

蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)

Description 如下面第一个图的九宫格中&#xff0c;放着 1~8 的数字卡片&#xff0c;还有一个格子空着。与空格子相邻的格子中的卡片可以移动到空格中。经过若干次移动&#xff0c;可以形成第二个图所示的局面。我们把第一个图的局面记为&#xff1a;12345678.把第二个图的局面…

DIV或者DIV里面的图片水平与垂直居中的方法 - 站住,别跑 - 博客园

DIV或者DIV里面的图片水平与垂直居中的方法 <div class“box”><img /> </div> 水平居中的常用方式&#xff1a; text-align:center ——这可以实现子元素字体&#xff0c;图片的水平居中。 margin:0 auto —— 这是针对块元素的水平居中方法 垂直居中的常…

设置图片元素上下垂直居中的7种css样式_赵一鸣博客

设置图片元素上下垂直居中的7种css样式 阅读(9548) 2018-07-15 14:13:34 图片、文字左右居中很简单&#xff0c;只需要以下代码&#xff1a; 1 text-align:center; 文字上下居中也很简单&#xff0c;假设外部div元素的高度是100px&#xff0c;那么&#xff1a; 1 line-heig…

day36 Pyhton 网络编程03

一.内容回顾 socket通常也称作"套接字"&#xff0c;用于描述IP地址和端口&#xff0c;是一个通信链的句柄&#xff0c;应用程序通常通过"套接字"向网络发出请求或者应答网络请求。 socket起源于Unix&#xff0c;而Unix/Linux基本哲学之一就是“一切皆文件”…

推荐21个顶级的Vue UI库! – TalkingData‘s Blog

推荐21个顶级的Vue UI库&#xff01; 最近&#xff0c;随着“星球大战”&#xff08;指 GitHub 的 Star 数量大比拼&#xff09;的爆发&#xff0c;Vue.js 在 GitHub 上的 Star 数超过了 React。虽然 NPM 的下载量仍然落后于 React&#xff0c;但 Vue.js 的受欢迎程度似乎在持续…

2019河北省大学生程序设计竞赛(重现赛)B 题 -Icebound and Sequence ( 等比数列求和的快速幂取模)...

题目链接&#xff1a;https://ac.nowcoder.com/acm/contest/903/B 题意&#xff1a; 给你 q,n,p,求 q1q2...qn 的和 模 p。 思路&#xff1a;一开始不会做&#xff0c;后面查了下发现有个等比数列求和的快速幂公式&#xff0c;附上链接https://www.cnblogs.com/yuiffy/p/380917…

nodejs服务后台持续运行

forever.jpeg 我用本地mac连接阿里云服务器&#xff0c;启动nodejs服务&#xff0c;客户端掉线&#xff0c;服务也会终止。如何在客户端掉线的情况下&#xff0c;node服务正常运行&#xff1f; forever介绍 forever是一个nodejs守护进程&#xff0c;完全由命令行操控。forev…

Node.js+Koa开发微信公众号个人笔记(一)准备工作 - ZhangCui - 博客园

本人也是在学习过程中&#xff0c;所以文章只作为学习笔记&#xff0c;如果能帮到你&#xff0c;那就更好啦~当然也难免会有错误&#xff0c;请不吝指出~ 一、准备工作 1、本人学习教程&#xff1a;慕课网Scott老师的《Node.js七天搞定微信公众号》 &#xff0c;但是有点小贵…

【vue-router①】router-link跳转页面传递参数 - 进击的前端之路(偶尔爬坑java小路) - SegmentFault 思否

在vue项目中&#xff0c;往往会遇到这样的情况&#xff0c;就是要实现在一个循环列表中&#xff0c;点击其中一条跳转到下个页面&#xff0c;然后将这一条的相关数据带到下个页面中显示&#xff0c;这是个循环列表&#xff0c;无论点哪一条都是跳到相同的页面&#xff0c;只是填…

Jmeter-【JSON Extractor】-响应结果中三级key取值

一、请求返回样式 二、取第三个option 三、查看结果 转载于:https://www.cnblogs.com/Nancy-Lee/p/10938758.html

手摸手,带你用vue撸后台 系列一(基础篇) - 掘金

完整项目地址&#xff1a;vue-element-admin 系列文章&#xff1a; 手摸手&#xff0c;带你用 vue 撸后台 系列一&#xff08;基础篇&#xff09;手摸手&#xff0c;带你用 vue 撸后台 系列二(登录权限篇)手摸手&#xff0c;带你用 vue 撸后台 系列三 (实战篇)手摸手&#xf…

webpack+vue+mui学习心得

引入mui 1.不需要npm安装; 直接从官方下载丢进来 2.那就是全局引用了; 没错,就是index.html里直接引入,当然也可以main.js引入,随意啦! so easy 3.找到webpack.base.conf.js,在module与plugins之间插入以下代码: 4.这样就可以在项目里面直接用了.然就是mui与vue-router及点…

【ARTS】01_04_左耳听风-20181203~1209

ARTS&#xff1a; Algrothm: leetcode算法题目Review: 阅读并且点评一篇英文技术文章Tip/Techni: 学习一个技术技巧Share: 分享一篇有观点和思考的技术文章Algorithm Single Number https://leetcode.com/problems/single-number/ 1&#xff09;problem Given a non-empty arra…

vue项目(webpack+mintui),使用hbuilder打包app - 小小人儿大大梦想 - 博客园

一、配置config/index.js 本人没有配置index.js文件&#xff0c;就开始进行了打包&#xff0c;结果最终效果是页面空白&#xff0c;解决了空白&#xff0c;接着底部图标&#xff08;我是用的阿里巴巴图片&#xff09;资源找不到。所以配置这步比较重要。 &#xff08;1&#…

caffe介绍

转载于:https://www.cnblogs.com/Artimis-fightting/p/10945099.html