基于Node實(shí)現(xiàn)可以操作MySQL的接口
前言
以前也用Node
寫(xiě)過(guò)接口,但不涉及數(shù)據(jù)庫(kù)操作。而我們發(fā)現(xiàn),自己公司的后端寫(xiě)接口,基本都繞不開(kāi)數(shù)據(jù)庫(kù)操作。感覺(jué)不寫(xiě)一個(gè)能操作數(shù)據(jù)庫(kù)的接口,就不算真正意義上學(xué)會(huì)了寫(xiě)接口。那我們今天就學(xué)習(xí)一下,如何寫(xiě)一個(gè)可以操作數(shù)據(jù)庫(kù)的接口。下面我們進(jìn)入正題。
創(chuàng)建Express項(xiàng)目
Express 是一個(gè)簡(jiǎn)潔而靈活的Node Web應(yīng)用框架, 通過(guò)對(duì)底層接口進(jìn)行封裝,在簡(jiǎn)化代碼的同時(shí)提供更強(qiáng)大的接口,大幅度提升開(kāi)發(fā)效率和體驗(yàn),將開(kāi)發(fā)者從冗長(zhǎng)、復(fù)雜、易錯(cuò)的代碼中解放出來(lái)。與創(chuàng)建Vue和React應(yīng)用一樣,創(chuàng)建Express項(xiàng)目也有腳手架可供使用。express-generator是Express的應(yīng)用生成器,用它可以快速創(chuàng)建一個(gè)Express的應(yīng)用骨架。
生成項(xiàng)目
安裝express-generator并生成一個(gè)名為nodeApi的Express Web應(yīng)用,命令如下:
npm i -g express-generator express nodeApi
生成的項(xiàng)目目錄結(jié)構(gòu)如下:
express項(xiàng)目目錄簡(jiǎn)介:
bin:可執(zhí)行文件。里面包含了一個(gè)啟動(dòng)文件 www 默認(rèn)監(jiān)聽(tīng)端口是 3000。
public:靜態(tài)文件。用來(lái)存放項(xiàng)目靜態(tài)文件如js+css以及圖片。
routes:路由文件。路由主要定義url和 資源的映射關(guān)系, 用來(lái)接收前端發(fā)送的請(qǐng)求,把響應(yīng)數(shù)據(jù)給前端
views:后端視圖模版文件。
app.js:入口文件。
運(yùn)行項(xiàng)目
推薦使用pnpm安裝項(xiàng)目依賴,速度比npm要快一些。安裝完依賴之后啟動(dòng)項(xiàng)目,后端服務(wù)不像前端項(xiàng)目,會(huì)自動(dòng)打開(kāi)一個(gè)頁(yè)面。
pnpm install && node bin/www
需在瀏覽器地址欄輸入http://localhost:3000/
, 如果能看到如下界面,說(shuō)明項(xiàng)目啟動(dòng)正常。
使用Docker安裝MySQL
為什么不直接安裝MySQL,而要使用Docker安裝MySQL呢?因?yàn)镈ocker能保證運(yùn)行環(huán)境的一致性,不會(huì)出現(xiàn)開(kāi)發(fā)環(huán)境,測(cè)試環(huán)境,生產(chǎn)環(huán)境同樣的配置表現(xiàn)不一致的問(wèn)題。其次,我看公司的生產(chǎn)環(huán)境也是在Docker上運(yùn)行MySQL。
安裝Docker
筆者使用的是Win操作系統(tǒng),Windows下Docker的安裝方法參見(jiàn)此文。如果Win系統(tǒng)提示無(wú)法安裝Docker,那你需要開(kāi)啟一下Hyper-V功能,如果Hyper-V 虛擬機(jī)監(jiān)控程序
處于禁用狀態(tài),那你需要在開(kāi)機(jī)的時(shí)候進(jìn)入BIOS
中,修改一下虛擬技術(shù)配置(不同品牌的電腦設(shè)置有差異,請(qǐng)自行搜索一下)。
運(yùn)行MySQL
docker安裝完成之后,需要重啟電腦。重啟之后運(yùn)行docker,然后在命令行執(zhí)行拉取MySQL鏡像命令
docker pull mysql:latest
在docker中安裝完MySQL后,使用以下命令來(lái)運(yùn)行mysql容器:
docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
參數(shù)說(shuō)明:
-itd
以交互模式在后臺(tái)運(yùn)行容器--name
設(shè)置容器名稱-p 3306:3306
:映射容器服務(wù)的 3306 端口到宿主機(jī)的 3306 端口,外部主機(jī)可以直接通過(guò) 宿主機(jī)ip:3306 訪問(wèn)到 docker容器的MySQL的服務(wù)。-e MYSQL_ROOT_PASSWORD=123456
:設(shè)置 MySQL服務(wù) root 用戶的密碼。
運(yùn)行結(jié)果如圖所示:
另外再補(bǔ)充兩條命令,因?yàn)閐ocker的bash中沒(méi)有vi/vim指令, 造成修改mysql配置文件困難。為了解決這個(gè)問(wèn)題,可以先把docker中的mysql配置文件復(fù)制到主機(jī),修改完成之后,再用主機(jī)修改之后的配置文件覆蓋docker中的mysql配置文件。
復(fù)制docker容器文件到主機(jī)
docker cp 容器id:/etc/my.cnf ./my.cnf
將主機(jī)文件復(fù)制到docker容器
docker cp ./my.cnf 容器id:/etc/my.cnf
創(chuàng)建數(shù)據(jù)
在MySQL中創(chuàng)建數(shù)據(jù)有兩種方式,第一種是使用SQL命令,第二種是使用可視化工具(推薦第二種)。
用SQL命令
# step1 查看容器id docker ps # step2 進(jìn)入docker命令行模式 docker exec -it 容器id ./bin/bash # step3 輸入密碼登錄mysql mysql -u root -p # step4 創(chuàng)建數(shù)據(jù)庫(kù)并插入數(shù)據(jù) create database demo character set utf8mb4 collate utf8mb4_unicode_ci; use demo; # 創(chuàng)建表 create table users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, mobile VARCHAR(100) NOT NULL ); # 向表中插入數(shù)據(jù) insert into users (name, mobile) values ('zhangsan', '13800000000'); insert into users (name, mobile) values ('lisi', '13800000001'); # 查看數(shù)據(jù) select * from users; # 退出mysql quit; # 退出docker容器命令行(非SQL命令) exit
用可視化工具
windows上推薦安裝Navicat數(shù)據(jù)庫(kù)管理工具軟件,下載安裝之后,創(chuàng)建連接, 界面配置參數(shù)如下:
連接成功之后, 進(jìn)入到demo數(shù)據(jù)庫(kù)的users表,可以看到之前用SQL命令插入的數(shù)據(jù)。添加刪除一條數(shù)據(jù)點(diǎn)擊一下底部的+
,-
號(hào)即可,比用SQL命令方便一些。
編寫(xiě)接口操作數(shù)據(jù)庫(kù)功能
借助Knex操作數(shù)據(jù)庫(kù)
為什么要用Knex操作MySQL,而不是直接使用npm中的mysql
/mysq2
工具包? 因?yàn)閚pm的mysql
/mysq2
在復(fù)雜查詢、遷移和事務(wù)處理上,需要手動(dòng)操作數(shù)據(jù)庫(kù),而且也不支持Promise鏈?zhǔn)秸{(diào)用。
Knex.js 是一個(gè)功能齊全的 SQL 查詢構(gòu)造器(query builder),支持 PostgreSQL、CockroachDB、MSSQL、MySQL、MariaDB、SQLite3、Better-SQLite3、Oracle 和 Amazon Redshift 等數(shù)據(jù)庫(kù),同時(shí)支持傳統(tǒng) node 風(fēng)格的 callback 回調(diào)和更加簡(jiǎn)潔的 promise異步接口,還支持 stream 接口、 全功能的 query(查詢 和 schema(模式)構(gòu)造器、事務(wù)(支持保存點(diǎn))、pooling(連接池),并且對(duì)不同的查詢客戶端以及 SQL 方言的執(zhí)行結(jié)果進(jìn)行了標(biāo)準(zhǔn)化。
安裝knex和mysql2
注意要安裝的mysql依賴包名叫mysql2
而不是mysql
, 前面我們安裝的是最新版MySQL,最新版的MySQL服務(wù)端不支持低版本mysql客戶端的加密方式,連接時(shí)會(huì)報(bào)錯(cuò)。需要改成高版本的MySQL客戶端 依賴包mysql2
,才能正常連接。
pnpm add knex mysql2
創(chuàng)建數(shù)據(jù)庫(kù)配置文件
數(shù)據(jù)庫(kù)配置文件config.js內(nèi)容如下,實(shí)際使用時(shí)這段代碼不能提交到代碼倉(cāng)庫(kù),要把敏感信息都寫(xiě)入到環(huán)境變量里,這里僅作演示.
const configs = { mysql: { host: "localhost", port: "3306", user: "root", // 數(shù)據(jù)庫(kù)用戶 password: "123456", // 數(shù)據(jù)庫(kù)密碼 database: "demo", // 數(shù)據(jù)庫(kù)的名字 }, // 打印錯(cuò)誤 log: { error(message) { console.log("[knex error]", message); }, }, }; module.exports = configs;
編寫(xiě)基本功能
const configs = require("../config"); const knex = require("knex")({ // 鏈接配置 connection: { host: configs.mysql.host, port: configs.mysql.port, user: configs.mysql.user, password: configs.mysql.password, database: configs.mysql.database, }, // 客戶端版本 client: "mysql2", // 打印錯(cuò)誤 log: { error(message) { console.log("[knex error]", message); }, }, }); class Base { constructor(props) { this.table = props.table; } // 新增 insert(params) { return knex(this.table).insert(params); } // 更改 update(id, params) { return knex(this.table).where("id", "=", id).update(params); } // 刪除 delete(id) { return knex(this.table).where("id", "=", id).del(); } // 查找 query() { return knex(this.table).select(); } } module.exports = Base;
編寫(xiě)主程序
接下來(lái)我們按照MVC的業(yè)務(wù)邏輯組織模式,實(shí)現(xiàn)主程序功能。先寫(xiě)增改刪查的控制器功能。代碼功能一看就懂,這里就不詳細(xì)解釋了。
// 引用用戶模版數(shù)據(jù) const User = require("../models/user.js"); const userController = { // 獲取用戶數(shù)據(jù) queryUser: async (req, res, next) => { try { let resData = await User.query(); res.json({ code: 200, message: "操作成功", data: resData, }); } catch (e) { res.json({ code: 0, message: "操作失敗", data: e }); } }, // 添加用戶數(shù)據(jù) addUser: async (req, res, next) => { try { let resData = await User.insert(req.body); res.json({ code: 200, message: "操作成功", data: resData, }); } catch (e) { res.json({ code: 0, message: "操作失敗", data: e }); } }, // 更新用戶數(shù)據(jù) updateUser: async (req, res, next) => { const { id, params } = req.body; try { let resData = await User.update(id, params); res.json({ code: 200, message: "操作成功", data: resData, }); } catch (e) { res.json({ code: 0, message: "操作失敗", data: e }); } }, // 刪除用戶數(shù)據(jù) delUser: async (req, res, next) => { try { let resData = await User.delete(req.body.id); res.json({ code: 200, message: "操作成功", data: resData, }); } catch (e) { res.json({ code: 0, message: "操作失敗", data: e }); } }, }; module.exports = userController;
接著寫(xiě)控制器引用的模型文件功能,主要是繼承數(shù)據(jù)庫(kù)基礎(chǔ)操作Base類的功能,支持配置表格名稱。
const Base = require("./base"); class User extends Base { // 定義參數(shù)默認(rèn)值為 user 表 constructor(props = { table: "users" }) { super(props); } } module.exports = new User();
再看看路由文件,定義請(qǐng)求URL和相應(yīng)方法的對(duì)應(yīng)關(guān)系。
const express = require("express"); const router = express.Router(); const userController = require("../controllers/user"); // ... // 獲取用戶信息 router.get("/get_user", userController.queryUser); // 新增用戶信息 router.post("/add_user", userController.addUser); // 修改用戶信息 router.post("/update_user", userController.updateUser); // 刪除用戶信息 router.post("/del_user", userController.delUser); module.exports = router;
最后在入口文件app.js中,引入路由配置
const express = require("express"); var usersRouter = require("./routes/users"); const usersRouter = require("./routes/users"); const app = express(); // 支持json參數(shù) app.use(express.json()); app.use("/users", usersRouter);
為了修改代碼能熱更新,需要全局安裝一下nodemon
npm i -g nodemon
并修改一下package.json中的服務(wù)啟動(dòng)命令,然后重啟服務(wù)。
"scripts": { "start": "nodemon ./bin/www" },
重啟之后,用postwoman請(qǐng)求express服務(wù)接口,驗(yàn)證一下接口響應(yīng)是否正確??梢钥吹?,響應(yīng)正常。
在Navicat查看,這條數(shù)據(jù)已經(jīng)插入到demo數(shù)據(jù)庫(kù)中的users表了。至此我們已經(jīng)實(shí)現(xiàn)了通過(guò)接口操作數(shù)據(jù)庫(kù)功能。
結(jié)尾
通過(guò)本文的介紹,我們了解了如何使用 Express 框架寫(xiě)接口操作 MySQL 數(shù)據(jù)庫(kù)。從Express應(yīng)用的創(chuàng)建、到MySQL數(shù)據(jù)庫(kù)的安裝,連接配置和數(shù)據(jù)庫(kù)的基本操作命令,以及接口Api的編碼和測(cè)試方法,我們一步步構(gòu)建了一個(gè)完整的可以操作MySQL數(shù)據(jù)庫(kù)的Express應(yīng)用程序。
以上就是基于Node實(shí)現(xiàn)可以操作MySQL的接口的詳細(xì)內(nèi)容,更多關(guān)于Node操作MySQL接口的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
node腳本實(shí)現(xiàn)自動(dòng)化簽到和抽獎(jiǎng)功能
本文主要介紹了node腳本實(shí)現(xiàn)自動(dòng)化簽到和抽獎(jiǎng)功能,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01nodejs連接mongodb數(shù)據(jù)庫(kù)實(shí)現(xiàn)增刪改查
本篇文章主要結(jié)合了nodejs操作mongodb數(shù)據(jù)庫(kù)實(shí)現(xiàn)增刪改查,包括對(duì)數(shù)據(jù)庫(kù)的增加,刪除,查找和更新,有興趣的可以了解一下。2016-12-12Node.js使用MongoDB的ObjectId作為查詢條件的方法
這篇文章主要介紹了Node.js使用MongoDB的ObjectId作為查詢條件的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09nodejs個(gè)人博客開(kāi)發(fā)第四步 數(shù)據(jù)模型
這篇文章主要為大家詳細(xì)介紹了nodejs個(gè)人博客開(kāi)發(fā)的數(shù)據(jù)模型,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04Node.js+Express.js+TS實(shí)現(xiàn)簡(jiǎn)單圖床腳本
在這篇博客文章中,我將介紹如何使用 TypeScript 和 Express 框架來(lái)編寫(xiě)一個(gè)簡(jiǎn)單的圖床腳本,可以將本地圖片上傳到服務(wù)器,并返回圖片的 URL,這樣,你就可以在 Markdown 文檔中方便地引用圖片,而不用擔(dān)心圖片的存儲(chǔ)和管理問(wèn)題2023-10-10如何使用nvm實(shí)現(xiàn)nodejs版本管理(版本刪除,版本切換及版本添加)
這篇文章主要給大家介紹了關(guān)于如何使用nvm實(shí)現(xiàn)nodejs版本管理(版本刪除,版本切換及版本添加)的相關(guān)資料,nvm是一個(gè)node版本管理工具,通過(guò)它可以安裝多種node版本并且可以快速、簡(jiǎn)單的切換node版本,需要的朋友可以參考下2023-10-10NodeJS?基于?Dapr?構(gòu)建云原生微服務(wù)應(yīng)用快速入門(mén)教程
Dapr?是一個(gè)可移植的、事件驅(qū)動(dòng)的運(yùn)行時(shí),它使任何開(kāi)發(fā)人員能夠輕松構(gòu)建出彈性的、無(wú)狀態(tài)和有狀態(tài)的應(yīng)用程序,并可運(yùn)行在云平臺(tái)或邊緣計(jì)算中,它同時(shí)也支持多種編程語(yǔ)言和開(kāi)發(fā)框架,本文重點(diǎn)介紹NodeJS云原生微服務(wù)應(yīng)用,感興趣的朋友一起看看吧2022-07-07