基于Node實現(xiàn)可以操作MySQL的接口
前言
以前也用Node寫過接口,但不涉及數(shù)據(jù)庫操作。而我們發(fā)現(xiàn),自己公司的后端寫接口,基本都繞不開數(shù)據(jù)庫操作。感覺不寫一個能操作數(shù)據(jù)庫的接口,就不算真正意義上學會了寫接口。那我們今天就學習一下,如何寫一個可以操作數(shù)據(jù)庫的接口。下面我們進入正題。
創(chuàng)建Express項目
Express 是一個簡潔而靈活的Node Web應用框架, 通過對底層接口進行封裝,在簡化代碼的同時提供更強大的接口,大幅度提升開發(fā)效率和體驗,將開發(fā)者從冗長、復雜、易錯的代碼中解放出來。與創(chuàng)建Vue和React應用一樣,創(chuàng)建Express項目也有腳手架可供使用。express-generator是Express的應用生成器,用它可以快速創(chuàng)建一個Express的應用骨架。
生成項目
安裝express-generator并生成一個名為nodeApi的Express Web應用,命令如下:
npm i -g express-generator express nodeApi
生成的項目目錄結構如下:

express項目目錄簡介:
bin:可執(zhí)行文件。里面包含了一個啟動文件 www 默認監(jiān)聽端口是 3000。
public:靜態(tài)文件。用來存放項目靜態(tài)文件如js+css以及圖片。
routes:路由文件。路由主要定義url和 資源的映射關系, 用來接收前端發(fā)送的請求,把響應數(shù)據(jù)給前端
views:后端視圖模版文件。
app.js:入口文件。
運行項目
推薦使用pnpm安裝項目依賴,速度比npm要快一些。安裝完依賴之后啟動項目,后端服務不像前端項目,會自動打開一個頁面。
pnpm install && node bin/www
需在瀏覽器地址欄輸入http://localhost:3000/, 如果能看到如下界面,說明項目啟動正常。

使用Docker安裝MySQL
為什么不直接安裝MySQL,而要使用Docker安裝MySQL呢?因為Docker能保證運行環(huán)境的一致性,不會出現(xiàn)開發(fā)環(huán)境,測試環(huán)境,生產(chǎn)環(huán)境同樣的配置表現(xiàn)不一致的問題。其次,我看公司的生產(chǎn)環(huán)境也是在Docker上運行MySQL。
安裝Docker
筆者使用的是Win操作系統(tǒng),Windows下Docker的安裝方法參見此文。如果Win系統(tǒng)提示無法安裝Docker,那你需要開啟一下Hyper-V功能,如果Hyper-V 虛擬機監(jiān)控程序處于禁用狀態(tài),那你需要在開機的時候進入BIOS中,修改一下虛擬技術配置(不同品牌的電腦設置有差異,請自行搜索一下)。

運行MySQL
docker安裝完成之后,需要重啟電腦。重啟之后運行docker,然后在命令行執(zhí)行拉取MySQL鏡像命令
docker pull mysql:latest
在docker中安裝完MySQL后,使用以下命令來運行mysql容器:
docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
參數(shù)說明:
-itd以交互模式在后臺運行容器--name設置容器名稱-p 3306:3306:映射容器服務的 3306 端口到宿主機的 3306 端口,外部主機可以直接通過 宿主機ip:3306 訪問到 docker容器的MySQL的服務。-e MYSQL_ROOT_PASSWORD=123456:設置 MySQL服務 root 用戶的密碼。
運行結果如圖所示:

另外再補充兩條命令,因為docker的bash中沒有vi/vim指令, 造成修改mysql配置文件困難。為了解決這個問題,可以先把docker中的mysql配置文件復制到主機,修改完成之后,再用主機修改之后的配置文件覆蓋docker中的mysql配置文件。
復制docker容器文件到主機
docker cp 容器id:/etc/my.cnf ./my.cnf
將主機文件復制到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 進入docker命令行模式
docker exec -it 容器id ./bin/bash
# step3 輸入密碼登錄mysql
mysql -u root -p
# step4 創(chuàng)建數(shù)據(jù)庫并插入數(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ù)庫管理工具軟件,下載安裝之后,創(chuàng)建連接, 界面配置參數(shù)如下:

連接成功之后, 進入到demo數(shù)據(jù)庫的users表,可以看到之前用SQL命令插入的數(shù)據(jù)。添加刪除一條數(shù)據(jù)點擊一下底部的+,-號即可,比用SQL命令方便一些。

編寫接口操作數(shù)據(jù)庫功能
借助Knex操作數(shù)據(jù)庫
為什么要用Knex操作MySQL,而不是直接使用npm中的mysql/mysq2工具包? 因為npm的mysql/mysq2在復雜查詢、遷移和事務處理上,需要手動操作數(shù)據(jù)庫,而且也不支持Promise鏈式調(diào)用。
Knex.js 是一個功能齊全的 SQL 查詢構造器(query builder),支持 PostgreSQL、CockroachDB、MSSQL、MySQL、MariaDB、SQLite3、Better-SQLite3、Oracle 和 Amazon Redshift 等數(shù)據(jù)庫,同時支持傳統(tǒng) node 風格的 callback 回調(diào)和更加簡潔的 promise異步接口,還支持 stream 接口、 全功能的 query(查詢 和 schema(模式)構造器、事務(支持保存點)、pooling(連接池),并且對不同的查詢客戶端以及 SQL 方言的執(zhí)行結果進行了標準化。
安裝knex和mysql2
注意要安裝的mysql依賴包名叫mysql2而不是mysql, 前面我們安裝的是最新版MySQL,最新版的MySQL服務端不支持低版本mysql客戶端的加密方式,連接時會報錯。需要改成高版本的MySQL客戶端 依賴包mysql2,才能正常連接。
pnpm add knex mysql2
創(chuàng)建數(shù)據(jù)庫配置文件
數(shù)據(jù)庫配置文件config.js內(nèi)容如下,實際使用時這段代碼不能提交到代碼倉庫,要把敏感信息都寫入到環(huán)境變量里,這里僅作演示.
const configs = {
mysql: {
host: "localhost",
port: "3306",
user: "root", // 數(shù)據(jù)庫用戶
password: "123456", // 數(shù)據(jù)庫密碼
database: "demo", // 數(shù)據(jù)庫的名字
},
// 打印錯誤
log: {
error(message) {
console.log("[knex error]", message);
},
},
};
module.exports = configs;
編寫基本功能
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",
// 打印錯誤
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;
編寫主程序
接下來我們按照MVC的業(yè)務邏輯組織模式,實現(xiàn)主程序功能。先寫增改刪查的控制器功能。代碼功能一看就懂,這里就不詳細解釋了。
// 引用用戶模版數(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;
接著寫控制器引用的模型文件功能,主要是繼承數(shù)據(jù)庫基礎操作Base類的功能,支持配置表格名稱。
const Base = require("./base");
class User extends Base {
// 定義參數(shù)默認值為 user 表
constructor(props = { table: "users" }) {
super(props);
}
}
module.exports = new User();
再看看路由文件,定義請求URL和相應方法的對應關系。
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中的服務啟動命令,然后重啟服務。
"scripts": {
"start": "nodemon ./bin/www"
},
重啟之后,用postwoman請求express服務接口,驗證一下接口響應是否正確??梢钥吹剑憫?。

在Navicat查看,這條數(shù)據(jù)已經(jīng)插入到demo數(shù)據(jù)庫中的users表了。至此我們已經(jīng)實現(xiàn)了通過接口操作數(shù)據(jù)庫功能。

結尾
通過本文的介紹,我們了解了如何使用 Express 框架寫接口操作 MySQL 數(shù)據(jù)庫。從Express應用的創(chuàng)建、到MySQL數(shù)據(jù)庫的安裝,連接配置和數(shù)據(jù)庫的基本操作命令,以及接口Api的編碼和測試方法,我們一步步構建了一個完整的可以操作MySQL數(shù)據(jù)庫的Express應用程序。
以上就是基于Node實現(xiàn)可以操作MySQL的接口的詳細內(nèi)容,更多關于Node操作MySQL接口的資料請關注腳本之家其它相關文章!
相關文章
nodejs連接mongodb數(shù)據(jù)庫實現(xiàn)增刪改查
本篇文章主要結合了nodejs操作mongodb數(shù)據(jù)庫實現(xiàn)增刪改查,包括對數(shù)據(jù)庫的增加,刪除,查找和更新,有興趣的可以了解一下。2016-12-12
Node.js使用MongoDB的ObjectId作為查詢條件的方法
這篇文章主要介紹了Node.js使用MongoDB的ObjectId作為查詢條件的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-09-09
nodejs個人博客開發(fā)第四步 數(shù)據(jù)模型
這篇文章主要為大家詳細介紹了nodejs個人博客開發(fā)的數(shù)據(jù)模型,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04
Node.js+Express.js+TS實現(xiàn)簡單圖床腳本
在這篇博客文章中,我將介紹如何使用 TypeScript 和 Express 框架來編寫一個簡單的圖床腳本,可以將本地圖片上傳到服務器,并返回圖片的 URL,這樣,你就可以在 Markdown 文檔中方便地引用圖片,而不用擔心圖片的存儲和管理問題2023-10-10
如何使用nvm實現(xiàn)nodejs版本管理(版本刪除,版本切換及版本添加)
這篇文章主要給大家介紹了關于如何使用nvm實現(xiàn)nodejs版本管理(版本刪除,版本切換及版本添加)的相關資料,nvm是一個node版本管理工具,通過它可以安裝多種node版本并且可以快速、簡單的切換node版本,需要的朋友可以參考下2023-10-10
NodeJS?基于?Dapr?構建云原生微服務應用快速入門教程
Dapr?是一個可移植的、事件驅動的運行時,它使任何開發(fā)人員能夠輕松構建出彈性的、無狀態(tài)和有狀態(tài)的應用程序,并可運行在云平臺或邊緣計算中,它同時也支持多種編程語言和開發(fā)框架,本文重點介紹NodeJS云原生微服務應用,感興趣的朋友一起看看吧2022-07-07

