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

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

  1. yarn add sequelize sequelize-typescript pg reflect-metadata

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

  1. /**
  2. * @name: 数据库配置
  3. * @param : undefined
  4. * @return : undefined
  5. */
  6. export const dbConfig = {
  7. host: 'localhost',
  8. database: 'demo',
  9. dialect: 'postgres',
  10. username: 'postgres',
  11. password: '123456'
  12. }

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. export class UserServiceImpl implements UserService{
  10. private userDao:UserDao;
  11.  
  12. constructor(){
  13. this.userDao = new UserDaoImpl();
  14. }
  15.  
  16. /**
  17. * @name: 查询
  18. * @param : undefined
  19. * @return : undefined
  20. */
  21. public findAll() {
  22. return this.userDao.findAll();
  23. }
  24. /**
  25. * @name: 查询
  26. * @param : undefined
  27. * @return : undefined
  28. */
  29. public findByName(username:string) {
  30. return this.userDao.findByName(username);
  31. }
  32. /**
  33. * @name: 新增
  34. * @param : entity
  35. * @return : undefined
  36. */
  37. public create(username: string, password: string) {
  38. return this.userDao.create({username,password});
  39. }
  40.  
  41. /**
  42. * @name: 删除
  43. * @param : undefined
  44. * @return : undefined
  45. */
  46. public delete(id: String) {
  47. return this.userDao.delete(~~id);
  48. }
  49.  
  50. }

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

至此连接数据库完成

目录结构:

typescript-koa-postgresql 实现一个简单的rest风格服务器 —— 连接 postgresql 数据库的更多相关文章

  1. typescript-koa-postgresql 实现一个简单的rest风格服务器 —— typescript 开发环境配置

    最近需要用 nodeJS 写一个后台程序,为了能够获得 IDE 的更多代码提示,决定用 typescript 来编写,随便也学习下 ts,在这记录下实现过程. 1.新建文件夹 typescript-k ...

  2. typescript-koa-postgresql 实现一个简单的rest风格服务器 —— 集成 koa

    接上文 1.安装 koa yarn add koa koa-router koa-static yarn add @types/koa @types/koa-router @types/koa-sta ...

  3. 一个简单的Java web服务器实现

    前言 一个简单的Java web服务器实现,比较简单,基于java.net.Socket和java.net.ServerSocket实现: 程序执行步骤 创建一个ServerSocket对象: 调用S ...

  4. 使用webpy创建一个简单的restful风格的webservice应用

    下载:wget http://webpy.org/static/web.py-0.38.tar.gz解压并进入web.py-0.38文件夹安装:easy_install web.py 这是一个如何使用 ...

  5. Golang学习-第二篇 搭建一个简单的Go Web服务器

    序言 由于本人一直从事Web服务器端的程序开发,所以在学习Golang也想从Web这里开始学起,如果对Golang还不太清楚怎么搭建环境的朋友们可以参考我的上一篇文章 Golang的简单介绍及Wind ...

  6. nodeJS搭建一个简单的(代理)web服务器

    前端获取数据时经常遇见跨域问题,以前一直用nginx做反向代理.最近在用vuejs,发现webpack-dev-server的代理简单好用.于是仿照写了一个简单的web服务器,用于非webpack的项 ...

  7. golang 创建一个简单的广播echo服务器

    package main; import ( "net" "fmt" "bufio" ) //里面的代码部分参考cmu440课程 //htt ...

  8. 初始nginx(启动运行) 使用nginx做一个简单的静态资源服务器

    第一次接触nginx的时候,那时候公司还是用的一些不知名的小技术,后来公司发展问题,重新招了人,然后接触到nginx,公司 使用nginx用来做代理服务器,所有请求 都先经过nginx服务器,然后交由 ...

  9. 搭建一个简单的node.js服务器

    第一步:安装node.js.可以去官网:https://nodejs.org/en/进行下载. 查看是否成功,只需在控制台输入 node -v.出现版本号的话,就证明成功了. 第二步:编写node.j ...

随机推荐

  1. 2018.06.27The Windy's(费用流)

    The Windy's Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 6003 Accepted: 2484 Descripti ...

  2. android检测手机是否安装某个app

    public static boolean isAvilible(Context context, String packageName){ //获取packagemanager final Pack ...

  3. vue 开发系列(五) 调用原生API

    概要 我们在开发手机端程序的时候了,我们经常需要使用到拍照,二维码的功能.数字天堂公司提供了大量的原生API支持. http://www.html5plus.org/doc/ 实现 1.在hbuild ...

  4. ACM-ICPC 2018 徐州赛区网络预赛 G Trace(逆向,两颗线段树写法)

    https://nanti.jisuanke.com/t/31459 思路 凡是后面的轨迹对前面的轨迹有影响的,可以尝试从后往前扫 区间修改需要push_down,单点更新所以不需要push_up(用 ...

  5. s5-1 CPU调度

    基本概念 通过多道程序设计得到 CPU 的最高利用率 (CPU-- I/O 脉冲周期 - - 进程的执行包括进程在 CPU 上执行和等待 I/O ) 进程的执行以 CPU 脉冲开始,其后跟着 I/O ...

  6. ROM的一种写法

    module mr_rom_pll_valuemask_8bpc #( , , , , // 6*7 // alt_clogb2(42) ) ( input wire clock, :] addr_p ...

  7. poj 1094 Sorting It All Out 拓补排序

    Description An ascending sorted sequence of distinct values is one in which some form of a less-than ...

  8. 信息安全技术PGP实验 20155205 20155218

    信息安全技术PGP实验 一.实验过程 PGP的安装与设置(Mac版) 访问GPGTools网站,下载GPG Suite for OS X,下载完毕,双击dmg文件,运行安装操作. 创建PGP密钥(一定 ...

  9. (转)私有代码存放仓库 BitBucket介绍及入门操作

    转自:http://blog.csdn.net/lhb_0531/article/details/8602139 私有代码存放仓库 BitBucket介绍及入门操作 分类: 研发管理2013-02-2 ...

  10. Java理论学时第四节。课后作业。

    请查看String.equals()方法的实现代码,注意学习其实现方法. public class StringEquals { public static void main(String[] ar ...