首先,放上项目 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
下载代码并部署
新建 express-mysql-demo 数据库,导入 project-datamodel 文件夹下的 user.sql
git clone https: //github.com/codethereforam/express-mysql-demo.git
cd express - mysql - demo && npm install#安装部署依赖的包
修改 conf/mysqlConf.js 中数据库配置信息
启动
打开首页: http://localhost:8888
# 切换到项目根路径
npm start
五,开发过程及代码分析
关于 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;
mysql 配置文件 conf/mysqlConf.js:
+----------+------------------+------+-----+---------+----------------+
| 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 | |
+----------+------------------+------+-----+---------+----------------+
SQL 语句封装模块 dao/userSqlMap.js:
module.exports = {
mysql: {
host: 'localhost',
user: 'root',
password: '',
database: 'express-mysql-demo',
// 最大连接数,默认为10
connectionLimit: 10
}
};
封装返回结果对象 model/result.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 = ?'
};
我这里使用了工厂方法创建结果对象,对象有两个属性,success 代表用户操作成功或失败,data 存放后台要返回的数据.
exports.createResult = function(success, data) {
var result = {};
result.success = success;
result.data = data;
return result;
};
下面分析修改用户部分信息的相关代码,全部的增删改查代码请将项目 clone 下来查看.
封装和数据库的交互模块 dao/userDAO.js:
这里使用了连接池,重复使用数据库连接,而不必每执行一次 CRUD 操作就获取,释放一次数据库连接,从而提高了对数据库操作的性能.
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);
});
}
};
用户操作路由及实现业务逻辑 routes/users.js:
router 根据不同的 HTTP 请求方法和访问路径执行相应的回调函数,回调函数中先记录日志,然后检查用户传过来的数据,接着调用 userDAO 的相应 CRUD 方法,最后返回一个 JSON 对象给前端.这里修改用户部分信息对应 HTTP 方法是 PATCH,而修改全部信息对应的是 PUT.
/* 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);
});
});
});
应用配置 app.js 中配置用户操作相关的路由:
app.use('/users', users);
前端 public/index.html 中与后台交互的 JS 代码:
前端使用 angualr.js,ajax 异步调用后端 restful API,然后解析后台返回的 JSON 对象在界面上展示.
(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);
来源: https://www.cnblogs.com/thinkam/p/8299452.html