記錄nodejs使用express搭建一個api服務器程序(5)-nodejs操作SQL數據庫,Sequelize和Knex

此文章是我自己用來記錄如何搭建一個以express爲基礎的api服務器框架的過程,並不是什麼新手教程,並不會每一步都寫得非常詳細,如果您要閱讀此文,需要一點nodejs和編寫代碼的基礎知識

文接上篇 鏈接: 地址 https://blog.csdn.net/goodboy31985/article/details/106260004
在上文基礎上,修改和完善api服務器的框架

安裝mysql數據庫的npm包

要在本機安裝mysql數據庫,推薦使用docker,具體內容可以參考之前的文章
鏈接: link https://blog.csdn.net/goodboy31985/article/details/106204527

無論你選擇是否使用Sequelize或者Knex等其他更方便的工具,爲了讓nodejs能夠操作mysql,需要安裝mysql包,直接使用npm安裝即可
npm install --save mysql2
安裝完成後,我們就已經可以再nodejs中連接並操作數據庫了

直接使用sql語句操作數據庫

我們先在數據庫中創建一個新的數據庫test 並新建一張表 palyer,裏面填寫一些數據
在這裏插入圖片描述
字段包括 id name age phone
並且有2條數據

在項目中新建一個DBManager的文件,創建一個數據庫管理類,來管理數據庫的操作
在這裏插入圖片描述
DBManager.ts文件內容

// lib/common/DBManager.ts

import mysql2 from "mysql2"

export class DBManager
{
    //單例
    private static instance: DBManager = null;
    private constructor()
    {

    }
    public static GetInstance()
    {
        if (DBManager.instance == null)
        {
            DBManager.instance = new DBManager();
        }
        return DBManager.instance;
    }


    //mysql數據庫對象
    sqldb = null;

    //連接數據庫,參數中填寫數據庫地址,端口等信息
    InitMysql()
    {
        this.sqldb = mysql2.createConnection({
            host: 'localhost',
            user: 'root',
            password: '123456',
            port: '3306',
            database: 'test'
        });
    }
}

在start.ts中寫一些測試代碼,測試是否能夠查詢成功

async function main()
{
    //日誌增強功能初始化
    LogHelper.Init();

    console.log("app start");

    //ApiServer.GetInstance().Init();
    //await ApiServer.GetInstance().Run();

    //mysql測試
    DBManager.GetInstance().InitMysql()
    DBManager.GetInstance().sqldb.connect();//連接數據庫
    DBManager.GetInstance().sqldb.query("SELECT * FROM player", (error, results, fields) =>
    {
        //如果查詢出現錯誤
        if (error) {
            console.error(error);
            DBManager.GetInstance().sqldb.end();//關閉連接
        }

        //打印查詢的結果
        console.log(results);
        DBManager.GetInstance().sqldb.end();//關閉連接
    });
}

main();

我們直接運行一下代碼
在這裏插入圖片描述
我們已經可以查詢到數據庫中相關的內容
這裏我們直接使用SQL查詢語句
在這裏插入圖片描述
當要執行比較複雜的數據庫操作時,直接使用SQL語句顯然是比較麻煩的,通常在項目中也很少會這樣直接使用,下面就介紹兩個比較常用的庫,來簡化我們的SQL操作

Knex使用

Knex是一款query builder(查詢構建器),讓我們可以使用nodejs風格的語句來進行SQL操作,很大程度上避免了直接使用SQL語句
直接使用npm進行安裝
npm install --save knex
npm install --save mysql //knex的功能同樣依賴於nodejs的mysql庫,如果你在前面已經安裝過,這步就可以跳過

修改DBManager.ts文件,引入knex,並使用knex建立連接

// lib/common/DBManager.ts

import knex from "knex"

export class DBManager
{
    //單例
    private static instance: DBManager = null;
    private constructor()
    {

    }
    public static GetInstance()
    {
        if (DBManager.instance == null)
        {
            DBManager.instance = new DBManager();
        }
        return DBManager.instance;
    }

    //mysql數據庫對象
    sqldb = null;

    //連接數據庫,參數中填寫數據庫地址,端口等信息
    InitMysql()
    {
        this.sqldb = knex({
            client: 'mysql',//指明數據庫類型,還可以是pg,sqlite3等等
            connection: {  //指明連接參數
                host: 'localhost',
                user: 'root',
                password: '123456',
                port: 3306,
                database: 'test'
            },
            debug: true, //指明是否開啓debug模式,默認爲true表示開啓
            pool: { //指明數據庫連接池的大小,默認爲{min: 2, max: 10}
                min: 2,
                max: 10,
            },
            acquireConnectionTimeout: 10000, //指明連接計時器超時,默認爲60000ms
        });
    }
}

export const db=DBManager.GetInstance()//直接導出一個db 代碼寫起來方便一點

使用了Knex之後,我們基本可以不用考慮查詢後連接的關閉問題,它默認是幫我們啓用連接池的
這裏我們修改一下start.ts中的查詢語句

async function main()
{
    //日誌增強功能初始化
    LogHelper.Init();

    console.log("app start");

    //ApiServer.GetInstance().Init();
    //await ApiServer.GetInstance().Run();

    //mysql測試
    db.InitMysql()
    let result = await db.sqldb.select().from("player");
    console.log(result);
    console.log(result[0]);
    console.log(result[0].name);

    result = await db.sqldb.select("name").from("player").where("id", ">", 1)
    console.log(result);

    
}

main();

在這裏插入圖片描述
代碼中執行了2次查詢,2個紅框分別是2次查詢的結果
並且可以直接使用 async 和 await 這樣的特性,方便我們寫異步代碼,脫離回調地獄

通過瀏覽器查詢用戶信息

接下來,我們重新調整一下代碼,使用瀏覽器向服務器發送請求,查詢用戶信息
使用 api/users/:id 這個路徑,通過向服務器發送id,獲取用戶信息
修改start.ts

//start.ts
import fs from "fs"
import json5 from "json5";
import path from 'path'
import { ApiServer } from "./ApiServer/ApiServer";
import { LogHelper } from "./lib/common/LogHelper";
import { DBManager, db } from "./lib/common/DBManager";

//項目根目錄
export const rootDir = __dirname + "/";

//加載配置文件
//讀取json5文件內容
let jsonFile = fs.readFileSync(path.join(rootDir, "config.json5")).toString();
//解析爲json文件,並作爲模塊輸出
export let config = json5.parse(jsonFile);


async function main()
{
    //日誌增強功能初始化
    LogHelper.Init();

    console.log("app start");

    //數據庫連接初始化
    db.InitMysql();

    ApiServer.GetInstance().Init();
    await ApiServer.GetInstance().Run();

}

main();

修改UserController.ts

// Controller/UserController.ts

import { Request, Response, NextFunction } from 'express'
import { db } from '../lib/common/DBManager';

export class UserController
{
    // GET users/:id
    static async UserInfo(req: Request, res: Response,next:NextFunction)
    {
        let user = req.params;
        console.log("receive a GET request");
        console.log('[', req.method, '][', req.originalUrl, ']');
        console.log(req.params);

        let userinfo=await db.sqldb.select().from("player").where("id", "=", req.params.id);
        
        return res.json(userinfo).end();
    }
}

啓動服務器,並且通過瀏覽器查詢用戶信息
在這裏插入圖片描述
在這裏插入圖片描述

Sequelize使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章