美文网首页
express + art-template + mysql的综

express + art-template + mysql的综

作者: 小本YuDL | 来源:发表于2019-07-26 19:47 被阅读0次

    上篇已经总结了最简单的express框架怎么用,那这篇就将实际操作结合吧。
    真是每天都是被bug缠身的一天,哎,什么时候能有个聪明的大脑呢,知识它就是不进脑子啊,着急有啥用,那说点有用的吧,也就这几天才接触的,还是了解的很少啊。
    此篇也只适合初学者看了。


    express的核心

    路由 、中间件、模板渲染

    • 首先,说下怎么用 art-template 模板吧

    • 安装
    npm install art-template --save
    npm install express-art-template --save
    
    • 配置
      指定解析引擎,官方给的是art,但实际操作中,都是解析以html为后缀的文件,所以我们也以html为例
    app.engine('html'),require('express-art-template');
    
    • 修改默认的渲染路径 (很重要

    express-art-template 默认的渲染的目录是views下面的,即所渲染的html模板在views目录下,如果需要修改默认渲染路径如下:

    app.set('views', 目录路径)
    

    这个当时不知道啥意思,踩雷比较严重,改了很久。

    eg: 像下面这个目录的话,就必须得改默认渲染路径了,不然肯定得出bug啊


    所有的文件都在public下,资源在resource目录,页面在static目录下
    app.set('views','public/static'); 
    
    简单的说,如果你的html页面在哪个目录下,就把路径改到哪个目录底下
    

    那标准的目录长什么样呢? 这样建目录的话,就不需要改默认路径啦


    就是这样了,几个js文件的意思,我们待会再看

    下面介绍怎么用模板吧,看怎么渲染模板。

    • 使用res.render('模板文件名',{模板数据})
    • res.render()方法也可以只加载页面,不用数据渲染
    • 写了res.rander() 就可以不用写 res.send() 了,服务器会自己进行相应操作
    app.get('/',function (req,res) {
       res.render('index.html',{
           data:{
               "title":"你好"
            }
       });
    });
    
    index.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>{{title}}</title>
    </head>
    <body></body>
    </html>
    

    • 下面简单说下 路由router.js 和 中间件 student.js吧

    因为是初学者,很头大。刚学的话,其实只要会模板渲染就好了,封装模块,有点麻烦,也有点绕,所以我自己也不是太会,只是简单的总结

    (自己做的学生信息管理系统为例)

    • router.js 文件其实是一个路由的封装 (部分代码)
    //express有专门的包装路由的
    const express = require('express');
    //导入文件操作模块 
    const Student = require('./student'); 
    //创建一个包装路由的容器
    const routor = express.Router();
    //渲染首页
    routor.get("/student",function (req, res) {
    });
    //添加  渲染页面  get请求
    routor.get('/student/add',function (req,res) {
    });
    //修改 渲染页面  get请求
    routor.get('/student/edit',function (req,res) {
    });
    //删除 get请求
    routor.get('/student/delete',function (req,res) {
    });
    module.exports = routor; //导出单个
    
    
    • student.js就是中间件,进行数据操作。
      router.js 调用 student.js完成请求的处理工作。
      最让人头大的就是异步操作得用回调函数 callback了,后面会认真去研究一下回调函数的使用 (部分代码)
    //此例子操作的是文件     文件操作模块
    const fs = require('fs');
    let dataPath = './data.json';
    /**
     * 获取所有学生列表
     * find的参数是 callback函数 
     * callback 的参数
     * 第一个是err  成功是null, 错误是 错误对象
     * 第二个是结果  成功是数组,错误是undefined
     * return []*/
    
    //查询所有信息
    exports.find = function (callback) {
       fs.readFile(dataPath,'utf8',function (err,data) {
           if(err){
               return callback(err);
           }
           callback(null,JSON.parse(data));
       }) 
    };
    //根据id 查询对应的信息
    exports.findByID = function(id,callback){
        fs.readFile(dataPath,'utf8',function (err,data) {
            if(err){
                return callback(err);
            }
           ....
            callback(null,result);
        })
    };
    
    • 前面的模块都那么复杂了,那app.js当然就很简单了,只是导入router.js模块,然后把路由 挂载到 app服务中即可
    const express = require("express");
    const bodyParser = require('body-parser');
    const router = require('./router');  //导入路由操作模块
    
    let app = express();
    //公开目录
    app.use('/node_modules/',express.static('./node_modules/'));
    app.use('/public',express.static('./public'));
    //引入模板
    app.engine('html',require('express-art-template'));
    
    //配置 body-parser信息 得在 挂载路由之前
    app.use(bodyParser.urlencoded({ extended: false }));
    app.use(bodyParser.json());
    
    //把路由 挂载到 app服务中
    app.use(router);
    
    app.listen(3030,function () {
       console.log("http://localhost:3030");
    });
    

    上面的操作初学者肯定会很晕,但其实如果代码没那么复杂,是可以直接写在一个件里的,不需要封装路由,及数据操作的。

    • 最后讲下数据库连接吧

    我也是很浅显的学习了一下连接数据库,操作数据
    如何配置以及增删改查等方法,在之前也总结过,这里就不说了

    下面看个 express + 模板渲染 + mysql 的综合吧(部分代码)
    只看app.js文件哦 ,很简单的单个文件操作,没有利用中间件及路由模块的封装。初学者比较适合。

    const express = require('express');
    const app = express();
    //post请求需要导入第三方模块
    const bodyParser = require('body-parser');
    const mysql = require('mysql');
    //连接 数据库
    let connection= mysql.createConnection({
        host     : 'localhost',
        user     : 'root',
        password : '***************',
        database : '***'
    });
    connection.connect();
    //指定开放目录资源
    app.use('/public/',express.static('./public'));
    app.use('/views/',express.static('./views'));
    //指定模板解析引擎
    app.engine('html',require('express-art-template'));
    //post请求需要的配置
    app.use(bodyParser.urlencoded({ extended: false }));
    app.use(bodyParser.json());
    
    (查询所有的数据渲染到页面中)
    app.get('/',function (req,res) {
        let sql = 'select * from test';  //查询语句
        connection.query(sql,function (err, result) {
            if(err){
                console.log('[SELECT ERROR] ',err.message);
                return;
            }
            res.render('index.html',{
                data: result
            });
        });
    });
    
    (res.render()方法可以只加载页面,不用数据渲染)
    app.get('/about',function (req,res) {
        res.render('about.html');  
    });
    
    (将提交的留言添加到数据库  (数据库中插入数据))
    app.post('/message',function (req,res) {
         let data = req.body;
         let  addSql = 'insert into comment(username,content,date,id) VALUES(?,?,?,0)';
         let  addSqlParams = [data.username,data.content,data.date,data.id];
         connection.query(addSql,addSqlParams,function (err,result) {
            if(err){
                console.log('[SELECT ERROR]',err.message); 
            }
            res.redirect('/message');  //插入数据库之后 重定向
        });
    });
    
    

    简单看下评论页面加载的模板吧,
    取渲染页面的数据data的属性名,与所查数据库中表的列名一致即可

     <div id="content-body">
               {{each data as value}}
                <div class="dialog-box">
                    <img src="{{value.headimg}}">
                    <div class="triangle-div">
                        <span>{{value.username}}</span>
                        <span>{{value.date}}</span>
                        <div>
                            <span>{{value.content}}</span>
                        </div>
                    </div>
                </div>
                {{/each}}
            </div>
    

    很简单的总结到此结束,以后如果深入学习的话,再深入总结吧,要开始学别的了。这个夏天,要加油!

    相关文章

      网友评论

          本文标题:express + art-template + mysql的综

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