欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Node實(shí)現(xiàn)可以操作MySQL的接口

 更新時(shí)間:2024年05月30日 09:05:01   作者:去偽存真  
這篇文章主要介紹了用Node寫(xiě)個(gè)可以操作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ù)的接口

前言

以前也用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)功能

    本文主要介紹了node腳本實(shí)現(xiàn)自動(dòng)化簽到和抽獎(jiǎng)功能,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 淺談Node.js中的定時(shí)器

    淺談Node.js中的定時(shí)器

    本文給大家分享的是Node.js中的定時(shí)器的相關(guān)資料,十分的全面細(xì)致,有需要的小伙伴可以參考下。
    2015-06-06
  • nodejs連接mongodb數(shù)據(jù)庫(kù)實(shí)現(xiàn)增刪改查

    nodejs連接mongodb數(shù)據(jù)庫(kù)實(shí)現(xiàn)增刪改查

    本篇文章主要結(jié)合了nodejs操作mongodb數(shù)據(jù)庫(kù)實(shí)現(xiàn)增刪改查,包括對(duì)數(shù)據(jù)庫(kù)的增加,刪除,查找和更新,有興趣的可以了解一下。
    2016-12-12
  • Node.js使用MongoDB的ObjectId作為查詢條件的方法

    Node.js使用MongoDB的ObjectId作為查詢條件的方法

    這篇文章主要介紹了Node.js使用MongoDB的ObjectId作為查詢條件的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • nodejs個(gè)人博客開(kāi)發(fā)第四步 數(shù)據(jù)模型

    nodejs個(gè)人博客開(kāi)發(fā)第四步 數(shù)據(jù)模型

    這篇文章主要為大家詳細(xì)介紹了nodejs個(gè)人博客開(kāi)發(fā)的數(shù)據(jù)模型,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Node.js+Express.js+TS實(shí)現(xiàn)簡(jiǎn)單圖床腳本

    Node.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版本管理(版本刪除,版本切換及版本添加)

    如何使用nvm實(shí)現(xiàn)nodejs版本管理(版本刪除,版本切換及版本添加)

    這篇文章主要給大家介紹了關(guān)于如何使用nvm實(shí)現(xiàn)nodejs版本管理(版本刪除,版本切換及版本添加)的相關(guān)資料,nvm是一個(gè)node版本管理工具,通過(guò)它可以安裝多種node版本并且可以快速、簡(jiǎn)單的切換node版本,需要的朋友可以參考下
    2023-10-10
  • 為什么node.js不適合大型項(xiàng)目

    為什么node.js不適合大型項(xiàng)目

    這篇文章主要介紹了為什么node.js不適合大型項(xiàng)目,想了解node.js的同學(xué),可以參考一下
    2021-04-04
  • NodeJS?基于?Dapr?構(gòu)建云原生微服務(wù)應(yīng)用快速入門(mén)教程

    NodeJS?基于?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
  • Node學(xué)習(xí)記錄之cluster模塊

    Node學(xué)習(xí)記錄之cluster模塊

    本篇文章主要介紹了Node學(xué)習(xí)記錄之cluster模塊,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05

最新評(píng)論