pug模板在Express框架中的集成

news2024/11/19 6:33:15

         在未讲相关的模板引擎之前前面的篇目中所使用的网页页面大多是静态资源的网页内容,如在之前的案例中就使用过 app.use(express.static('path.join(__dirname,'public')')) ,通过在本地上进行搭建服务器之后使用express.static()方法讲public下静态资源进行共享,那么在下面编写一个index.html静态网页文件后可以通过http://127.0.0.1:3000/index.html进行访问;那么在本篇内容就在express框架中引入express模板引擎 —— pug模板引擎,pug模板前身是jade,在生成的express框架项目中可以在views中看到有index.jade、error.jade和layout.jade文件;

        模板引擎可以实现显示界面与逻辑处理的分离,在应用中使用静态模板文件,在运行时替换模板文件中的变量,将渲染后的HTML文件发送给服务端,以便更好的关注到视图层;

        下面就来将之前使用过的一个案例来使用pug模板引擎把所用的HTML代码进行替换,那么按照我们先前的篇目讲过的案例来的话可能就有更加深刻的理解了,虽然没有讲关于pug模板的一个语法使用之类的,如后续有的话会再来讲,这里主要是使用pug模板在express框架当中集成:(案例取自本栏的cookie在express)

1 . 原 /public/index.html 文件 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CSDN</title>
    <script src="/checklogin"></script>
</head>
<body>
    <header>
        <h3>首页</h3>
    </header>
    <div class="content">
        <p>正在维修中...</p> 
    </div>
</body>
</html>

        将原来的style标签中的样式提取为index.css文件存放 /public/stylesheets/index.css ;然后在pug模板集成中进行引入即可;

2. pug模板集成 —— /views/index.pug 文件 (严格注意缩进)

doctype html
html 
    head
        title CSDN
        link(rel="stylesheet", href="./stylesheets/index.css")
        script(src="/checklogin") 
    body 
        header 
            h3 首页
        .content
            p 正在维修中 

3. 原 /public/login.html 文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Login</title>
    <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
</head>
<body>
    <div class="content">
        <div class="head">
            <img src="../images/CSDN.png" alt="" srcset="">
        </div>
        <form action="">
            <div class="form-input">
                <div class="form-data">
                    <span>账户:</span>
                </div>
                <input type="text" class="input-text" name="username" value=""/>
            </div>
            <div class="form-input">
                <div class="form-data"> 
                    <span>密码:</span>
                </div>
                <input type="password" class="input-text" name="password" value=""/>
            </div>
        </form>
            <input type="submit" class="form-submit" value="登录" id="btuLogin" />
    </div>
</body>
</html>

4. pug模板集成 —— /views/login.pug 文件 (严格注意缩进)

doctype html 
html 
    head 
        title Login
        link(rel="stylesheet", href="./stylesheets/login.css")
        script(type="text/javascript" src="./javascripts/jquery.min.js") 
        script(type="text/javascript" src="./javascripts/login.js") 
    body 
        .content 
            .head
                img(src="./images/CSDN.png")
            form(action="")
                .form-input 
                    .form-data 
                        span 账户:
                    input(type="text" class="input-text" name="username" value="")
                .form-input 
                    .form-data 
                        span 密码:
                    input(type="password" class="input-text" name="password" value="")
            input(type="submit" class="form-submit" id="btuLogin" value="登录")

 将原来的style标签中的样式提取为index.css文件存放 /public/stylesheets/login.css ;然后将下载好的jquery.min.js文件放到 /public/javascrtipts/ 目录下,以及将要执行的jquery文件分离出来,同样放置在该目录下,即/login.js文件;


        完成以上的内容,接下来就是路由文件的配置了,下面就是原先的app.js配置信息内容:

var express = require('express');
var router = express.Router();
const fs = require('fs');
const {resolve} = require('path');

router.get('/', function(req, res) {
  res.render('index', { title: 'Express' });
});

// 检查是否登录
router.get('/checklogin',function(req,res){
    // 首先检查是否有cookie
    let cookie = req.cookies.userName;
    if(!cookie){
        res.send('alert("请先登录...");location.href = "./login.html";')
    }else{
        res.send({
            code:0
        });
    }
})

// 登录路由
router.post('/userlogin',function(req,res){
    // 获取前台发送过来的账户密码
    let user = req.body.username,pwd = req.body.password;

    // 读取user.json数据,遍历是否有该用户信息;
    // let results = fs.readFileSync(resolve( __dirname,'../public/user.json'));
    let results = fs.readFileSync(resolve( __dirname,'../public/user.json'));
    results = JSON.parse(results);  
    console.log(results);
    // 验证 —— 遍历
    for(var i = 0; i<results.length; i++){
        if(results[i].username == user && results[i].password == pwd){
            // 验证成功则发送cookie
            res.cookie("userName",user,{
                maxAge:200000000,
                httpOnly:true
            })
            res.send({
                code:0,
                msg:'ok'
            })
            return;
        }
    }
    // 验证失败
    if(i==results.length){
        res.send({
            code:1,
            msg:'error'
        })
    }
})
module.exports = router;

        下面来将这里将原来的请求url http://127.0.0.1:3000/ 进行一个重定向,每次请求该地址会进行重定向到 http://127.0.0.1:3000/index,通过res.render()方法来呈现视图;具体看下面的修改后的代码:

var express = require('express');
var router = express.Router();
var {resolve} = require('path');
var fs = require('fs');

/* GET home page. */
router.get('/', function(req, res, next) {
  res.redirect('/index');
});

router.get('/index',function(req,res,next){
  res.render('index.pug');
})

router.get('/checklogin',function(req,res,next){
  // 首先检查是否有cookie
  let cookie = req.cookies.userName;
  if(!cookie){
      res.send('alert("请先登录...");location.href = "./login";')
  }else{
      res.send({
          code:0
      });
  }
})

router.get('/login', function(req, res, next) {
  res.render('login.pug');
});


// 登录路由
router.post('/userlogin',function(req,res,next){
  // 获取前台发送过来的账户密码
  let user = req.body.username,pwd = req.body.password;

  // 读取user.json数据,遍历是否有该用户信息;
  // let results = fs.readFileSync(resolve( __dirname,'../public/user.json'));
  let results = fs.readFileSync(resolve( __dirname,'../public/user.json'));
  results = JSON.parse(results);  
  console.log(results);
  // 验证 —— 遍历
  for(var i = 0; i<results.length; i++){
      if(results[i].username == user && results[i].password == pwd){
          // 验证成功则发送cookie
          res.cookie("userName",user,{
              maxAge:200000000,
              httpOnly:true
          })
          res.send({
              code:0,
              msg:'ok'
          })
          return;
      }
  }
  // 验证失败
  if(i==results.length){
      res.send({
          code:1,
          msg:'error'
      })
  }
})

module.exports = router;

下面进行对上面代码测试运行:

测试运行

        先将项目进行运行跑起来:

npm start

下面通过请求 http:// 127.0.0.1:3000 看是否会自动重定向:

        通过请求url: http://127.0.0.1:3000/ 会重定向到 http://127.0.0.1:3000/index,通过查看代码可以知道这个script标签去执行请求 http://127.0.0.1:3000/checklogin,由于没用cookie,所以无法进入index页面转向login登录页面:

        通过输入错误的内容来查看是否会有执行错误的提示并且清空输入框的数据在账户的输入框中获取到焦点:(错误的数据可以对比这个user.json中的数据);

         下面通过输入正确的用户信息(username:Yan,password:yan)可以实现正常的跳转到程序的首页index。

     如上已经测试完成,下面来看一下pug模板集成的页面是怎样的,url http://127.0.0.1:3000/login

让后通过打开控制台中的【Network】选项,查询login,可以看到如下:

        与之前使用 .html文件不同,可以看到使用pug模板集成的就是这样一整行的,与单独编写.pug文件后进行编译之后得到的html文件也是一整行的,先前的可以会看之前的是如下这样的:

        以上通过pug模板引擎将先前所编写的cookie案例进行调整,更加清楚的了解pug模板,pug模板整洁但是学习成本比较高,所以这里并没有多讲关于pug模板的一个编写过程,当然模板引擎不止有pug模板,在之后会来讲另外一个模板引擎ejs,ejs对掌握html知识读者来讲会比较好过渡,但不如pug模板页面代码结构简洁反而复杂,那么本篇的内容就到此,内容可能有些 "苦涩"请谅解,最终依然感谢大家的支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/183345.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uni-app从入门到上天视频教程 23讲 我终于卷完了

大家好&#xff0c;我是锋哥&#xff01;祝大家新年快乐&#xff01; 过年走亲访友&#xff0c;休息了几天&#xff0c;今天把uni-app课程卷完了&#xff0c;23讲&#xff0c;免费基础课程。 uni-app技术介绍 uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;…

(免费分享)springboot音乐网站系统

开发工具&#xff1a;eclipse&#xff0c;数据库mysql5.7 jdk1.8技术&#xff1a;springbootmybatis/** * * * */package com.bjpowernode.music.ss.service.impl;import java.util.List;import javax.annotation.Resource;import com.bjpowernode.music.common.AbstractServ…

即时通讯开发之TCP/IP基本概念

在世界上各地&#xff0c;各种各样的电脑运行着各自不同的操作系统为大家服务&#xff0c;这些电脑在表达同一种信息的时候所使用的方法是千差万别。就好像圣经中上帝打乱 了各地人的口音&#xff0c;让他们无法合作一样。计算机使用者意识到&#xff0c;计算机只是单兵作战并不…

【数据结构】详解顺序表

目录 1.线性表和顺序表 1.线性表 2.顺序表 2.接口的实现 1. 接口1---初始化顺序表 2. 接口2&#xff0c;3---头插&#xff0c;尾插 3. 接口4&#xff0c;5---头删&#xff0c;尾删 4. 接口6&#xff0c;7---插入&#xff0c;删除 5. 接口8---查找 6. 接口9---修改 7.…

什么是HTTPS?为什么要为您的网站购买一个?

HTTPS或安全超文本传输协议是HTTP的安全版本&#xff0c;是一种用于在Web浏览器和网站之间通过Web传输数据的协议。HTTPS通过使用一种称为传输层安全性(TLS)的加密协议对服务器和浏览器之间传递的所有数据进行加密&#xff0c;以提高安全性&#xff0c;该协议前面是SSL&#xf…

【Pytorch项目实战】之人脸检测与识别:基于face_recognition开源人脸识别库

文章目录人脸检测与识别&#xff08;一&#xff09;实战&#xff1a;人脸检测&#xff08;图片&#xff09;&#xff08;二&#xff09;实战&#xff1a;人脸检测与识别&#xff08;视频&#xff09;人脸检测与识别 face_recognition 是开源人脸识别库。Face Recognition官网。…

启科 QuTrunk+Runtime+QuSaaS+亚马逊云科技量子计算编程实战

QuTrunk 是启科量子自主研发的一款免费、开源、跨平台的量子计算编程框架&#xff0c;包括量子编程 API、量子命令转译、量子计算后端接口等。它提供多种量子计算体验&#xff0c;提供本地量子计算 Python 计算后端&#xff0c;提供 OMP 多线程、MPI 多节点并行、GPU 加速等计算…

操作系统权限提升(一)之操作系统权限介绍

前言 操作系统权限提升简称提权,顾名思义就是提升自己在目标系统中的权限。现在的操作系统都是多用户操作系统,用户之间都有权限控制,比如通过Web漏洞拿到的是web进程的权限,往往Web服务都是以一个权限很低的账号启动的,因此通过 Webshell进行一些操作会受到限制,这就需要将其…

Leetcode力扣秋招刷题路-0094

从0开始的秋招刷题路&#xff0c;记录下所刷每道题的题解&#xff0c;帮助自己回顾总结 94. 二叉树的中序遍历&#xff08;Easy&#xff09; 给定一个二叉树的根节点 root &#xff0c;返回它的 **中序 **遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出…

无线网络概论_4

成帧细节 数据帧&#xff1a;好比802.11中的驮马&#xff0c;负责在工作站直接板运输数据。控制帧&#xff1a;通常能够与数据帧搭配使用&#xff0c;负责区域的清空&#xff0c;信道的取得以及载波监听的维护并于收到数据时给予肯定确认&#xff0c;借此来增加数据传输的可靠…

垃圾收集器必问系列—CMS

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 应该相信&#xff0c;自己是生活的战胜者。——雨果 文章目录CMS简介运作过程CMS的缺陷处理器资源敏感无法处理“浮动垃圾”内存碎片纵观全书《深入理解JVM虚拟机》第三版&#xff0c;在垃圾回收器这一篇章&a…

CMakelists.txt简单介绍

先祝大家开工大吉&#xff0c;这篇策划一下CMakelists.txt&#xff0c;它依托在Cmake里&#xff0c;在大型工程、平台兼容方面非常好用的C项目编译工具&#xff0c;再此先对它做一个简短的介绍。 目录 一、CMakelists.txt简介 二、使用示例 三、总结 一、CMakelists.txt简介…

Eclipse swt环境搭建

通过Eclipse Marketplace安装打开eclipse&#xff0c;点击help&#xff0c;在弹出的框中&#xff0c;选择Eclipse Marketplace。如下所示。。。搜索windows 安装插件一、创建一个SWT项目点击左上角的File - > New -> Other...进入后搜索SWT ,选中在WindowBuilder下的SWT …

CnOpenData中国彩票销售数据

一、数据简介 彩票是一种编有号码的证券&#xff0c;按票面价格出售。开奖后&#xff0c;持有中奖号码奖券的&#xff0c;可按规定领奖。它是一种建立在机会均等基础上的、具有公平竞争特征的娱乐游戏。国家发行彩票的目的是筹集社会公众资金&#xff0c;资助福利、体育等社会公…

springboot中整合mybatis及简单使用

springboot中整合mybatis及简单使用1.引入依赖2.在applicaiton.yaml中配置数据源以及mybatis3.创建sql测试表4.编写mapper接口和mapper.xml文件4.1 mapper接口4.2 mapper.xml4.3 mybatisX快速开发插件5.创建service层和controller层5.1 创建service层5.2 创建controller层6.项目…

[网鼎杯 2018]Fakebook

目录 信息收集 代码审计 思路 解法一&#xff08;非预期解&#xff09; 解法二&#xff08;预期解&#xff09; 信息收集 目录扫描代码泄露扫描 robots.txt;flag.php;login.php;user.php;view.php;join.php; 直接打开flag.php后没有回显&#xff0c;应该需要通过ssrf来访…

Qt音视频开发12-easyplayer内核

一、前言 在视频监控行业经常看到两个厂家广告打得比较厉害&#xff0c;一个是青犀视频对应easyplayer&#xff0c;一个是大牛直播&#xff0c;两个最初都是sdk免费&#xff0c;并提供调用示例源码&#xff0c;后面大牛直播的sdk以及示例都无法运行&#xff0c;目前就剩下免费…

Word处理控件Aspose.Words功能演示:如何在 C# .NET 中将 PNG、JPG 转换为 Word

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c; Aspose API支持流行文件格式处…

git push clone 参数具体解析

1 问题背景 git远程仓库有很多命令&#xff0c;但是教程里面讲解的都是特别模糊的。 2 命令实例解析 2.1 git branch -vv -a命令具体解析 在开始下面的命令解析之前&#xff0c;我们一定要学会git branch -vv -a这个命令&#xff0c;这个是查询本地仓库远程仓库跟踪关系最全…

《从0开始学大数据》之ZooKeeper是如何保证数据一致性的

背景 在分布式集群系统中&#xff0c;比如两个应用程序都需要对一个文件路径进行写操作&#xff0c;但是如果两个应用程序对于哪台服务器是主服务器的判断不同&#xff0c;就会分别连接到两个不同的 NameNode 上&#xff0c;并都得到了对同一个文件路径的写操作权限&#xff0…