美文网首页让前端飞Web前端之路前端开发
nodejs+express+mysql搭建web服务器(实现a

nodejs+express+mysql搭建web服务器(实现a

作者: 齐梓曦 | 来源:发表于2019-07-05 16:58 被阅读3次

    本篇适宜阅读对象:前端开发,想要使用nodejs搭建自己的web服务器,打通数据库,提供api。(大神们敬请指正或绕路)

    利用nodejs+express+mysql搭建一个web服务程序,操作数据库,提供api接口供以调用。使你的页面不再纯静态。话不多说先上项目结构

    该项目使用express脚手架搭建生成,nodejs,express,及mysql相关文档请自行查阅

    nodejs
    express
    mysql

    项目结构

    
    |---bin (框架生成,服务启动命令文件夹)
    |---conf (自行添加文件夹,放置配置文件)
    |-------mysqlConf.js // mysql配置
    |---dao (自行添加文件夹,放置数据库交互js)
    |-------users (对应数据库下的users表)
    |-----------users_dao.js // users表操作
    |-----------users_sql.js // users表相关语句
    |---public (框架生成,静态资源存储)
    |-------images
    |-------javascripts
    |-------stylesheets
    |---routes (框架生成,路由配置/api)
    |-------users.js // users相关接口及文档说明页
    |---util (自行添加文件夹,放置公用js)
    |-------result.js // 最终返回结果包装js
    |---views (框架生成,页面存放)
    |-------error.pug
    |-------users.pug (自行添加pug模板页面,用于users接口说明)
    |-------index.pug
    |-------layout.pug
    |---app.js (框架生成,项目核心)
    
    

    如果只是用来做一个简单的web服务器,提供接口则以上的public,views可完全忽略。接下来就细分来看:顺序介绍 app.js == > mysql 数据库操作 == > routes api构建

    app.js

    
    <!--导入相关使用模块-->
    var createError = require('http-errors'); // 处理错误(框架生成)
    var express = require('express'); // (框架生成)
    var path = require('path'); // 路径 (框架生成)
    var cookieParser = require('cookie-parser'); // cookie (框架生成)
    var logger = require('morgan'); // 日志 (框架生成)
    var sassMiddleware = require('node-sass-middleware'); // sass 中间件 (框架生成)
    
    var indexRouter = require('./routes/index'); // index 路由 (框架生成)
    var usersRouter = require('./routes/users'); // users 路由 // (自行添加)
    
    var app = express();
    
    // view engine setup
    app.set('views', path.join(__dirname, 'views')); // 设置视图根目录(框架生成)
    app.set('view engine', 'pug'); // 使用 pug 模板(框架生成)
    
    // 声明使用中间件
    app.use(logger('dev')); // (框架生成)
    app.use(express.json()); // (框架生成)
    app.use(express.urlencoded({ extended: false })); // (框架生成)
    app.use(cookieParser()); // (框架生成)
    app.use(sassMiddleware({ // (框架生成)
      src: path.join(__dirname, 'public'),
      dest: path.join(__dirname, 'public'),
      indentedSyntax: true, // true = .sass and false = .scss
      sourceMap: true
    }));
    app.use(express.static(path.join(__dirname, 'public'))); // (框架生成)
    
    <!-- 解决请求跨越 -->
    app.all('/*',function (req, res, next) { // (自行添加)
      res.header('Access-Control-Allow-Origin', '*');
      res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With');
      res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
      if (req.method == 'OPTIONS') {
        res.sendStatus(200);
      }
      else {
        next();
      }
    });
    
    // 声明路由
    app.use('/', indexRouter); // (框架生成)
    app.use('/users', usersRouter); // (自行添加)
    
    // catch 404 and forward to error handler 自定义404中间件(框架生成)
    app.use(function(req, res, next) {
      next(createError(404));
    });
    
    // error handler 自定义错误抛出中间件 (框架生成)
    app.use(function(err, req, res, next) { 
      // set locals, only providing error in development
      res.locals.message = err.message;
      res.locals.error = req.app.get('env') === 'development' ? err : {};
    
      // render the error page
      res.status(err.status || 500);
      res.render('error');
    });
    
    module.exports = app;
    
    

    从标注上可以看出,自行改动的地方并不多,仅添加了跨域解决,users对应声明,而框架生成部分调用其它组件可自行处置。

    mysql 数据库操作

    • mysqlConf.js
    
    let mysql = require("mysql") // 导入mysql模块
    
    let mysql_config = { // mysql采用pool连接池基础配置 (采用pool连接池与不采用配置略有不同,具体请查看文档)
        connectionLimit : 10, // 最大连接数
        host            : 'XX.XXX.XXX.XX', // 本地搭建则本机ip,远程服务器则远程服务器ip 
        user            : 'root', // mysql 账户
        password        : '******', // mysql 密码
        database        : 'test_db' // 要操作的数据库
    }
    let pool = mysql.createPool(mysql_config); // 创建连接池
    
    module.exports = {
        pool
    }
    
    

    连接远程服务器mysql需先设置服务器上MySQL对外开放连接权限,配置服务器mysql对应端口号。

    • dao/users/users_sql.js
    
    <!-- 对数据库中的users表进行增,删,查操作语句 -->
    module.exports = {
        addUser:"INSERT INTO users (headerImg, username, password, addres, sex, mobile, email) VALUES (?, ?, ?, ?, ?, ?, ?);",
        deleteUser: "DELETE FROM users WHERE id = ?;",
        queryUser: "SELECT * FROM users WHERE id = ?;",
    }
    
    
    • dao/users/users_dao.js
    
    let { pool } = require("../../conf/mysqlConf.js")
    let {addUser, deleteUser, queryUser } = require('./users_sql.js')
    
    module.exports = {
        add: function (user, callback) { // users表中增加user操作
            let sqlparam = [
                user.headerImg?user.headerImg:"",
                user.username?user.username:"",
                user.password?user.password:"",
                user.addres?user.addres:"",
                user.sex?user.sex:1,
                user.mobile?user.mobile:"",
                user.email?user.email:"",
            ]
            pool.query(addUser, sqlparam, function (error, result) {
                if (error) throw error;
                callback(result);
            });
        },
        deleted: function(params, callback) { // users表中删除指定user操作
            let {id} = params
            let sqlparam = [id]
            pool.query(deleteUser, sqlparam, function (error, result) {
                if (error) throw error;
                callback(result);
            });
        },
        query: function(params, callback) { // users表中查询指定user操作
            let {id} = params
            let sqlparam = [id]
            pool.query(queryUser, sqlparam, function (error, result) {
                if (error) throw error;
                callback(result[0]);
            });
        },
    }
    
    

    以上为面对sql的操作,只做了简单实例,更多复杂操作还需自行琢磨。接下来看一看routes/users.js的内容

    routes/users.js api生成

    
    var express = require('express');
    var router = express.Router();
    
    let { add, deleted, query } = require("../dao/users/users_dao.js"); // 数据库操作
    let result = require("../util/result.js") // 最终结果统一格式
    
    /* GET users listing. */
    router.get('/', function(req, res, next) { // users 相关接口说明文档页面
      res.render('users', { title: 'usersApi', 
            apiList:[
                {
                    url:"users/adduser(添加用户)",
                    method:"POST",
                    params:{
                        headerImg:"用户头像", 
                        username:"用户名称",
                        addres:"用户地址",
                        sex:"用户性别",
                        mobile:"手机号",
                        email:"邮箱"
                    },
                    result:{
                        "success": true,
                        "data":``
                    }
                },
                {
                    url:"users/deleteuser(删除用户)",
                    method:"GET",
                    params:{
                        id:"用户ID"
                    },
                    result:{
                        "success": true,
                        "data":``
                    }
                },
                {
                    url:"users/deleteuser(查询用户)",
                    method:"GET",
                    params:{
                        id:"用户ID"
                    },
                    result:{
                        "success": true,
                        "data":`{
                            id: 1,
                            headerImg:"用户头像", 
                            username:"用户名称",
                            addres:"用户地址",
                            sex:"用户性别",
                            mobile:"手机号",
                            email:"邮箱"
                        }`
                    }
                },
            ]
        });;
    });
    // 添加用户 post请求
    router.post('/adduser', function(req, res, next) {
      let urlParam = req.body;
      console.log(urlParam);
      add(urlParam,function(success){
        let r =  result.createResult(success, null);
        res.json(r);
      })
    });
    // 删除指定用户 get请求
    router.get('/deleteuser', function(req, res, next) {
      let urlParam = {
        id: req.query.id
      };
      console.log(urlParam);
      deleted(urlParam,function(success){
        let r =  result.createResult(success, null);
        res.json(r);
      })
    });
    // 获取指定用户信息 get请求
    router.get('/queryuser', function(req, res, next) {
      let urlParam = {
        id: req.query.id
      };
      console.log(urlParam);
      query(urlParam,function(success){
        let r =  result.createResult(true, success);
        res.json(r);
      })
    });
    
    module.exports = router;
    
    

    至此,已经完成了三个users相关接口。看下调用实例

    • views/users api说明文档

      • 说明文档


        usersApi.png
    • 本地启服务调用

      • 数据库users表原状态
      数据库users表原状态
      • 调用删除接口删除id=13的用户
      deleteUser.png
      • 调用删除接口之后的users表
    deleteUserResult.jpg
    • 调用添加用户接口
    adduser.png
    • 添加用户之后的users表
    addUserReslut.png
    • 代码上传至服务器,调用服务器上接口

      • 调用查询用户id=6
      serviceQueryUser.png
      • 调用查询用户服务器日志
      serviceQueryUserLog.png

    至此结束,本人水平有限,实力一般。个人学习之用,发于此篇.如果对你有用不妨留下个赞再走,有更好的建议也欢迎私信或评论我

    相关文章

      网友评论

        本文标题:nodejs+express+mysql搭建web服务器(实现a

        本文链接:https://www.haomeiwen.com/subject/jtwehctx.html