首先,放上项目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

三、环境搭建

  • node.js: https://nodejs.org/en/download/package-manager/
  • mysql: https://dev.mysql.com/doc/refman/5.7/en/installing.html

四、项目运行

  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,可参考阮一峰的两篇文章:

  • 理解RESTful架构
  • RESTful API 设计指南

我使用的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对象在界面上展示。

版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者thinkam和本文原始地址或出处:
http://www.cnblogs.com/thinkam | https://codethereforam.github.io

转载于:https://www.cnblogs.com/itrena/p/8305876.html

进入全屏 nodejs+express+mysql实现restful风格的增删改查示例相关推荐

  1. 基于 Spring Boot 的 Restful 风格实现增删改查

    前言 在去年的时候,在各种渠道中略微的了解了SpringBoot,在开发web项目的时候是如何的方便.快捷.但是当时并没有认真的去学习下,毕竟感觉自己在Struts和SpringMVC都用得不太熟练. ...

  2. ssm框架restful风格实现增删改查

    1.什么是restful风格 大家在做Web开发的过程中,method常用的值是get和post. 可事实上,method值还可以是put和delete等等其他值. 既然method值如此丰富,那么就 ...

  3. restful风格的增删改查

    注意 如果静态资源放到了静态资源文件夹下却无法访问,请检查一下是不是在自定义的配置类上加了@EnableWebMvc注解 templete文件夹不是静态资源的文件夹,默认是无法访问的,所以要添加视图映 ...

  4. Node连接MySQL数据库进行基本的增删改查操作(一看就会)

    Node连接MySQL数据库进行基本的增删改查操作(一看就会) ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ...

  5. Mysql —— C语言链接mysql数据库,实现可以增删改查的角色权限登录系统

    /******************************************************************** * 标题:C语言链接mysql数据库,实现可以增删改查的角色 ...

  6. MYSQL - database 以及 table 的增删改查

    MYSQL - database 以及 table 的增删改查 MySQL的相关概念介绍 MySQL 为关系型数据库(Relational Database Management System), 这 ...

  7. ASP.NET Web——GridView完整增删改查示例(全篇幅包含sql脚本)大二结业考试必备技能

    ASP.NET Web--GridView 完整增删改查示例(全篇幅包含sql脚本)大二结业考试必备技能 环境说明 系统要求:win7/10/11 开发语言:C# 开发工具:Visual Studio ...

  8. MySQL 使用SQL语句实现 增删改查

    MySQL 使用SQL语句实现 增删改查 环境准备:MySQL,navicat 一.增加数据 语法: INSERT INTO 表名(字段1,字段2,字段3...) VALUES(值1,值2,值3... ...

  9. mysql创建数据表列子,MySQL 创建数据库及简单增删改查

    MySQL 创建数据库及简单增删改查 我们可以在登陆 MySQL 服务后,使用 create 命令创建数据库,语法如下: CREATE DATABASE 数据库名; 登入: Enter passwor ...

最新文章

  1. Python教学课程分享9-面向对象编程
  2. 解决导入Android例子时“Unable to resolve target 'android-x' ”的错误
  3. Java访问指示符 访问修饰符
  4. 开放平台_OAuth2.0
  5. DSP学习-- UTC转UNIX时间戳
  6. 一般将来时语法课教案_【语法视频课】第43~45节(虚拟语气)
  7. 求两个相交链表的交点
  8. SpringBoot: SpringBoot里面创建导出Excel的接口(亲测)
  9. python常用的包_Python3之常用包汇总
  10. java注解执行顺序_如何确保java中的注释执行顺序?
  11. 阿里大牛精心整理了46张PPT,教你弄懂JVM、GC算法和性能调优!
  12. GDAL源码剖析(二)之编译说明
  13. 在计算机网络GAN代表什么,图解 生成对抗网络GAN 原理 超详解
  14. 软件产品测试报告模板
  15. 丽丽的redhat终于可以上网了
  16. c语言 %x,%d,%c,%s,%x各代表什么
  17. 【微信公众号】6、SpringBoot整合WxJava创建自定义菜单
  18. Machine Learning Algorithms Study Notes(4)—无监督学习(unsupervised learning)
  19. i7 10750h是标压吗 属于什么档次 i7 10750h天梯图
  20. matlab对信号的滤波方法

热门文章

  1. 374. Guess Number Higher or Lower
  2. C# 文本操作类 Trim() 和Replace()的用法小例子
  3. org.hibernate.HibernateException: 'hibernate.dialect' must be set when no Connection avalable
  4. BAPI_SALESDOCU_CREATEFROMDATA1--VA01
  5. java蓝桥杯算法训练 相l邻字母(题解)
  6. java编写布局文件_鸿蒙OS利用JAVA编写的布局实践练习
  7. GDB的工作原理及skyeye远程调试
  8. Mapreduce的工作流程
  9. (56)FPGA面试题-如果连线宽度不匹配怎么办?
  10. (7)FPGA面试题Latch和Register区别