nodejs+express+mysql實現restful風格的增刪改查示例

来源:https://www.cnblogs.com/thinkam/archive/2018/01/16/8299452.html
-Advertisement-
Play Games

首先,放上項目github地址:https://github.com/codethereforam/express mysql demo 一、前言 之前學的java,一直用的ssm框架寫後臺。前段時間接觸到node.js,於是花了兩天時間學了一下node.js並寫了一個CRUD簡單示例。由於前幾天一 ...


首先,放上項目github地址:https://github.com/codethereforam/express-mysql-demo

一、前言

之前學的java,一直用的ssm框架寫後臺。前段時間接觸到node.js,於是花了兩天時間學了一下node.js並寫了一個CRUD簡單示例。由於前幾天一直學用github pages搭建博客,一直沒時間寫README,今天有空補了上來。

下麵來內容自於項目的README

二、項目介紹

基於node.js + express + mysql實現的restful風格的CRUD簡單示例

2.1 組織結構

├── app.js -- 應用配置
├── bin
│   └── www -- 項目運行腳本
├── conf 
│   └── mysqlConf.js -- mysql配置文件
├── dao
│   ├── userDAO.js -- 封裝和資料庫的交互
│   └── userSqlMap.js -- SQL語句封裝
├── model
│   └── result.js -- 返回結果對象封裝
├── package.json -- 依賴模塊
├── project-datamodel
│   └── user.sql -- 資料庫腳本
├── public -- 前端靜態頁面
│   ├── add.html
│   ├── css
│   │   └── style.css
│   ├── detail.html
│   ├── index.html
│   └── modify.html
└── routes
    └── users.js -- 用戶操作路由及業務邏輯

2.2 模塊依賴

www -> app.js -> users.js ->  userDAO.js -> mysqlConf.js & userSqlMap.js

2.3 技術選型

後端技術

  • node.js
  • express

前端技術

  • angular.js

三、環境搭建

四、項目運行

  1. 下載代碼並部署
git clone https://github.com/codethereforam/express-mysql-demo.git
cd express-mysql-demo && npm install   #安裝部署依賴的包
  1. 新建express-mysql-demo資料庫,導入project-datamodel文件夾下的user.sql

  2. 修改conf/mysqlConf.js中資料庫配置信息

  3. 啟動

# 切換到項目根路徑
npm start
  1. 打開首頁: http://localhost:8888

五、開發過程及代碼分析

關於restful,可參考阮一峰的兩篇文章:

我使用的IDE是IDEA,安裝"NodeJS"插件後依次點擊

File -> New Project -> Node.js and NPM -> Node.js Express App

IDEA預設使用express-generator生成項目結構。

新建資料庫"express-mysql-demo":

create database `express-mysql-demo`;

新建user表:

CREATE TABLE `express-mysql-demo`.`user` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(45) NOT NULL,
  `password` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`id`))
DEFAULT CHARACTER SET = utf8mb4;

表結構:

+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| id       | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| username | varchar(45)      | NO   |     | NULL    |                |
| password | varchar(45)      | NO   |     | NULL    |                |
+----------+------------------+------+-----+---------+----------------+

mysql配置文件conf/mysqlConf.js:

module.exports = {
    mysql: {
        host: 'localhost',
        user: 'root',
        password: '',
        database:'express-mysql-demo',
        // 最大連接數,預設為10
        connectionLimit: 10
    }
};

SQL語句封裝模塊dao/userSqlMap.js:

var userSqlMap = {
    add: 'insert into user(username, password) values(?, ?)',
    deleteById: 'delete from user where id = ?',
    update: 'update user set username=?, password=? where id=?',
    list: 'select * from user',
    getById: 'select * from user where id = ?'
};

封裝返回結果對象model/result.js:

exports.createResult = function(success, data) {
    var result = {};
    result.success = success;
    result.data = data;
    return result;
};

我這裡使用了工廠方法創建結果對象,對象有兩個屬性,success代表用戶操作成功或失敗,data存放後臺要返回的數據。

下麵分析修改用戶部分信息的相關代碼,全部的增刪改查代碼請將項目clone下來查看。

封裝和資料庫的交互模塊dao/userDAO.js:

var pool = mysql.createPool(mysqlConf.mysql);
module.exports = {
     getById: function (id, callback) {
        pool.query(userSqlMap.getById, id, function (error, result) {
            if (error) throw error;
            console.log(result[0]);
            callback(result[0]);
        });
    },update: function (user, callback) {
        pool.query(userSqlMap.update, [user.username, user.password, user.id], function (error, result) {
            if (error) throw error;
            callback(result.affectedRows > 0);
        });
    }
};

這裡使用了連接池,重覆使用資料庫連接,而不必每執行一次CRUD操作就獲取、釋放一次資料庫連接,從而提高了對資料庫操作的性能。

用戶操作路由及實現業務邏輯routes/users.js:

/* patch users */
router.patch('/:id', function (req, res) {
    console.log('patch users called');
    userDAO.getById(req.params.id, function (user) {
        var username = req.body.username;
        if(username) {
            user.username = username;
        }
        var password = req.body.password;
        if(password) {
            user.password = password;
        }
        console.log(user);
        userDAO.update(user, function (success) {
            var r =  result.createResult(success, null);
            res.json(r);
        });
    });
});

router根據不同的HTTP請求方法和訪問路徑執行相應的回調函數,回調函數中先記錄日誌,然後檢查用戶傳過來的數據,接著調用userDAO的相應CRUD方法,最後返回一個JSON對象給前端。這裡修改用戶部分信息對應HTTP方法是PATCH,而修改全部信息對應的是PUT。

應用配置app.js中配置用戶操作相關的路由:

app.use('/users', users);

前端public/index.html中與後臺交互的JS代碼:

(function (window) {
            window.angular.module('list', [])
                .controller('listCtrl', function ($scope, $http) {                
                    $scope.doPatch = function (id) {
                        var data = JSON.stringify({
                            password: document.getElementById("pwd" + id).value
                        });
                        $http.patch("/users/" + id, data)
                            .then(function (response) {
                                console.debug(response.data.success);
                            }, function (err) {
                                alert(err);
                            });
                    };
                });
        })(window);

前端使用angualr.js,ajax非同步調用後端restful API,然後解析後臺返回的JSON對象在界面上展示。


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

-Advertisement-
Play Games
更多相關文章
  • 註:本文章示例為C#代碼,設計模式通用任何編程語言,可放心閱讀 設計模式(3W1H) What?針對特定問題特出的特定的解決方案 Why?讓程式有更好的可擴展度 Where?一般情況下,開發中真正使用設計模式的地方不多。面試 JVM底層機制 模式 框架底層應用了很多設計模式 How?任何時候、任何場 ...
  • 解決方法一 重置視窗佈局: windows > perspective > reset perspective 解決方法二: 如果上述方法不好使,採用下麵的這種方法: 刪除workspace的/.metadata/.plugins/org.eclipse.core.resources/.projec ...
  • 堆和棧都是Java用來在RAM中存放數據的地方。 堆 (1)Java的堆是一個運行時數據區,類的對象從堆中分配空間。這些對象通過new等指令建立,通過垃圾回收器來銷毀。 (2)堆的優勢是可以動態地分配記憶體空間,需要多少記憶體空間不必事先告訴編譯器,因為它是在運行時動態分配的。但缺點是,由於需要在運行時 ...
  • 在上一篇文章中(Java的參數傳遞是值傳遞還是引用傳遞),主要分析了java語言的參數傳遞只有按值傳遞而沒有按引用傳遞。 先看一下微軟的C#文檔對按引用傳遞的定義(如下截圖):https://docs.microsoft.com/zh-cn/dotnet/csharp/language-refere ...
  • 瞭解就行了** 通過新建file建立含有標簽,標簽屬性##xml的格式如下,就是通過<>節點來區別數據結構的: <?xml version="1.0"?> <data> <country name="Liechtenstein"> <rank updated="yes">2</rank> <year ...
  • 當一個對象被當作參數傳遞到一個方法後,在此方法內可以改變這個對象的屬性,那麼這裡到底是值傳遞還是引用傳遞? 答:是值傳遞。Java 語言的參數傳遞只有值傳遞。當一個實例對象作為參數被傳遞到方法中時,參數的值就是該對象的引用的一個副本。指向同一個對象,對象的內容可以在被調用的方法內改變,但對象的引用( ...
  • 1.開發環境 (推薦):jdk1.8+Maven(3.2+)+Intellij IDEA+windows10; 說明: jdk:springboot官方說的很明確,到目前版本的springboot(1.5.9),官方指定要求jdk1.8以上; 依賴包管理:可以通過拷貝jar文件的方式管理依賴,但官方 ...
  • [原創] 前幾天沒事幹看別人一直在玩微信上線的那一個跳一跳小游戲,玩著玩著老是掉下去,閑著沒事唄 就想了想做一個輔助程式的唄.不過先做的手動版的.自動版的有點麻煩.就不發了.用的Java寫的,也就一個蒙版. 下麵就開始介紹我的小程式,沒好多東西,真正的代碼應該就是100行左右,沒啥難的. 下麵這是我 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...