从0开始的Express.js+MySql+Vue2搭建一个旅游项目(一)
快速创建一个Express项目
npm安装
npm install -g express-generator
express --help
express hello_express
使用包执行器npx安装
mkdir hello_express
cd hello_express
npm init
npx express-generator --no-view .
npm install
npm install -D @types/express
开发自动化管理工具安装 nodemon
npm install nodemon -D
编辑package.json中的scripts添加"dev"
"scripts": {
"dev": "SET DEBUG=hello_express:* & nodemon ./bin/www"
}
Mysql的安装
npm install --save mysql2
Swagger安装与配置(如果不需要接口文档也可省略)
安装
npm install -D swagger-ui-express @types/swagger-ui-express
npm install -D swagger-jsdoc @types/swagger-jsdoc
配置一
在app.json中导入Swagger模块,并配置其路由路径
详细介绍可以看这里
Swagger是一个很好的后台接口文档,建议学习一下
// 导入Swagger-ui-express模块
const swaggerUi = require("swagger-ui-express");
// 导入Swagger-jsdoc模块
const swaggerJsdoc = require("swagger-jsdoc");
// 中间件: Swagger
const options = {
definition: {
openapi: "3.0.0",
info: {
titile: "XXX",
version: "1.0.0",
},
},
apis: [path.join(__dirname, "./routes/*.js")],
};
const openapiSpecification = swaggerJsdoc(options);
app.use("/dev-api", swaggerUi.serve, swaggerUi.setup(openapiSpecification));
配置二
在routes/index.js中配置路由和swagger
在这里我只是简单的使用了一下Swagger
详细使用方法这儿
/**
* @swagger
* /:
* get:
* tags:
* - 默认路由
* summary: 获取网站的提示信息
* description: 默认路由
* responses:
* 200:
* description: 默认路由响应
*/
router.get('/', function(req, res, next) {
res.json({msg: "默认路由响应"});
});
创建文件夹
在hello_express文件夹下,创建common,controller,mysql三个文件夹
common是存放工具类的
controller是控制器层
mysql是数据层
创建工具模块
在common中创建utils.js文件其中代码如下:
这个utils.js的作用是一些公共的功能模块
FormatJSONData的作用是统一返回格式,方便前端获取数据,并且根据code来判断返回值是否正确。
md5pwd的作用就是在给前端返回的密码进行加密后,再存放到数据库中
/**
* 公共功能模块
*/
//导入debug模块,并定义两个名字空间
const debug = require("debug")("mybook-server:[debug]");
const error = require("debug")("mybook-server:[error]");
/**
* JSONData数据类型说明
*
* @typedef {Object} JSONData
* @property {Number} code
* @property {String} msg
* @property {(Object | Array)} data
*
*/
/**
* 统一格式返回的JSON数据
*
* 200 - 访问成功
*
* @param {Number} code - 返回自定义的状态码
* @param {String} msg - 提示消息
* @param {Object | Array} data - 数据结果
* @returns {JSONData}
*/
function FormatJSONData(code, msg = "", data = []) {
if(!data){
data = [];
}
return {code: code, msg: msg, data: data};
}
/**
* 生成MD5后的密码
* @param {String} password - 密码
* @returns {String} - 16进制的密码串
*/
function md5pwd(password) {
let salt = config.salt;
let md5 = crypto.createHash("md5");
return md5.update(password+salt).digest("hex");
}
module.exports = {
FormatJSONData,
md5pwd
}
在common中创建db.js文件其中代码如下:
db.js文件的作用就是让我们访问数据库,后续再调用query方法传入sql语句和参数,就可以对数据库进行增删查改的操作
如果想仔细研究使用方法,关于mysql的使用:这里
/**
* 访问数据库
*/
const mysql = require('mysql');
const pool = mysql.createPool({
connectionLimit : 10,
host : '127.0.0.1',
user : 'user',
password : 'password',
database : 'XXX'
});
/**
* 获取SQL执行结果
* @returns {Promise}
*/
function query(sql,values) {
return new Promise((resolve,reject)=>{
// 连接池中获取连接
pool.getConnection((error,connection)=>{
if(error){
reject(error);
}else {
// 执行SQL语句
connection.query(sql,values,(error,results) => {
// 释放连接
connection.release();
if(error) {
reject(error);
}else {
resolve(results);
}
});
}
})
});
}
module.exports = { query };
这样一个简单的express项目就算是创建完成了接下来只要在controller,routes,mysql里面写东西即可
这边我推荐一个网站,需要应用什么包都可以查询链接
现在我写一个简单的示例:新增用户
观察app.js中是否有引入需要的路由模块
我们需要先导入默认的路由模块,这个的作用就是告诉系统,我们有哪些模块
定义默认路由模块,这里的作用就是,给路由模块指定基准路由
像下面的/users,中导入了usersRouter ,代表usersRouter里面的路径都是基于/users/XXX
// 导入路由模块
// 导入默认路由
var indexRouter = require('./routes/index');
// 导入用户路由
var usersRouter = require('./routes/users');
// 定义路由模块
// 默认路由指向 /
app.use('/', indexRouter);
// 用户路由指向 /users
app.use('/users', usersRouter);
如果后续有新的模块可以依照这样的方式继续导入其他模块比如:评论、文章…等模块
MySql层:创建user.js文件
mysql的作用
获取控制器传过来的数据,并设计sql语句,将传过来的数据和sql语句传给query方法,获取返回值再返还给controller
/**
*
* User数据模型模块
*/
// 导入工具模块
const util = require("../../common/util");
// 导入连接数据库模块
const db = require("../../common/db");
/**
* 新增用户
* @param {Object} user
* @returns {Promise}
*/
function adduser(user) {
return new Promise((resolve, reject) => {
let sql = `INSERT INTO tb_user(
createtime,email,nickname,
password,realname,sex,tel,
username,touxiang,rolename,updatetime
)VALUES (
?,?,?,
?,?,?,?,
?,?,?,?
);
`
let params = [
user.createtime,
user.email,
user.nickname,
user.password,
user.realname,
user.sex,
user.tel,
user.username,
user.touxiang,
user.rolename,
user.updatetime
];
db.query(sql, params).then(result => {
resolve(result.insertId);
}).catch(error => {
reject(error);
})
});
}
module.exports = {
adduser
}
controller层:创建user.js文件
控制器层的作用:
获取前端返回的数据,将数据传入mysql中,再把mysql中返回的数据传给前端
/**
* User控制器模块
*/
const express = require("express");
const util = require("../common/util");
/**
* @typedef {UserDB}
*/
const UserDB = require("../mysql/user");
/**
* 新增用户
* @param {Express.Request} - 请求
* @param {Express.Response} - 响应
*/
function adduser(req,res) {
let now = new Date();
let user = {
createtime: now.toISOString(),
email:req.body.email,
nickname:req.body.nickname,
password:util.md5pwd(req.body.password),
realname:req.body.realname,
sex:req.body.sex,
tel:req.body.tel,
username:req.body.username,
touxiang:req.body.touxiang,
rolename:req.body.rolename,
updatetime: now.toISOString(),
}
util.log(user);
UserDB.adduser(user).then(result => {
console.log(result);
res.json(
util.FormatJSONData(201, `新增用户信息`, result)
);
}).catch(err => {
console.error(err);
});
}
module.exports = {
adduser
}
routes层:创建user.js文件
routes的作用
给方法一个路径,通过这个路径可以访问到所需要的方法
/**
* User路由模块
*/
var express = require('express');
var router = express.Router();
const user = require("../controller/user");
// 新增用户
router.post("/",user.adduser);
module.exports = router;
测试是否成功
在express中创建一个test.http文件
在其中写入
### 新增用户数据
POST http://127.0.0.1:3004/users HTTP/1.1
Content-Type: application/json
{
"email":"11111111@qq.com",
"nickname":"xx",
"password":"123456",
"realname":"xxx",
"sex":"x",
"tel":"12344445555",
"username":"xxx",
"touxiang":"imag",
"rolename":1
}
点击发送请求,即可测试是否成功,其中{}中的数据,是根据你建立的表来写的,包括前面的controller和mysql层的数据,都是要看你的数据库中的数据来设计的
现在,我们已经把基于Express后台的内容搭建完成,需要其他功能,可以根据上面的模板,继续添加即可。