typescript-koa-postgresql 實現一個簡單的rest風格伺服器 —— 連接 postgresql 資料庫

来源:https://www.cnblogs.com/lifefriend/archive/2018/11/29/10025469.html
-Advertisement-
Play Games

接上一篇,這裡使用 sequelize 來連接 postgresql 資料庫 1、安裝 sequelize,資料庫驅動 pg 2、新建配置文件夾 conf 及 配置文件 db.conf.ts 3、連接資料庫,新建文件夾 db 及 配置文件 db.ts 4、資料庫實體類,新建文件夾 models 及文 ...


接上一篇,這裡使用 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

 

至此連接資料庫完成

 

目錄結構:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 支付寶小程式自定義彈窗組件wcPop|小程式自定義對話框|actionSheet彈窗模板 支付寶小程式官方提供的alert提示框、dialog對話框、model彈窗功能比較有限,有些都不能隨意自定義修改的。如是自己就捯飭著封裝了個支付寶小程式自定義彈窗插件wcPop,多種展示場景,隨意修改調用。 自 ...
  • With Custom Elements, web developers can create new HTML tags, beef-up existing HTML tags, or extend the components other developers have authored. ...
  • 1. 2. 3.(類似法2) ...
  • js如何判斷值是否是數字 1. isNaN()方法2. 正則表達式var re = /^[0-9]+.?[0-9]*$/; //判斷字元串是否為數字 //判斷正整數 /^[1-9]+[0-9]*]*$/3. 利用parseFloat的返回值 isNaN(inputData)不能判斷空串或一個空格;如 ...
  • 在掘金上看到了一位大佬發了一篇很詳細的面試記錄文章 "《一年半經驗,百度、有贊、阿裡面試總結》" ,為了查漏補缺,抽空就詳細做了下。( 估計只有我這麼無聊了哈哈哈 ) 有給出的或者有些不完善的答案,也儘力給出/完善了(可能有錯,大家自行辨別)。有些很困難的題目(例如實現 ),附帶相關鏈接(懶癌患者福 ...
  • 1. Virtual DOM是什麼 Virtual DOM,即虛擬DOM樹。瀏覽器在解析文件時,會將 文檔轉換為 對象,在瀏覽器環境中運行的腳本文件都可以獲取到它,通過操作 對象暴露的介面可以直接操作頁面上的DOM節點。但是DOM讀寫是非常耗性能的,很容易觸發不必要的重繪和重排,為了更好地處理DOM ...
  • 一、DOM對象 DOM對象整體包括: HTML DOM Document對象 HTML DOM 元素對象 HTML DOM 屬性對象 HTML DOM 事件對象 HTML DOM Console 對象 CSS Style Declaration 對象 二、 Document對象詳解 HTML DOM ...
  • 棧是一種LIFO(Last-In-First-Out,後進先出)的數據結構著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。原文: https://www.w3cplus.com/javascript/array-part-3.html © w3cplus.com 棧是一種後進先出 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...