从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后台的内容搭建完成,需要其他功能,可以根据上面的模板,继续添加即可。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值