NodeJS_08_art-template子模板与模板继承_MongoBooster_express-session_三大类中间件_全局错误处理

这篇博客介绍了NodeJS中art-template模板引擎的子模板和模板继承概念,以及如何使用MongoBooster和express-session中间件。此外,讨论了Express的错误处理中间件和不同类型的中间件,包括应用级、路由器级和错误处理中间件的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NodeJS七天课程学习笔记_第8天 Blog综合案例

Blog 综合案例 (包含注册登录、修改密码注销发布分页列表、评论、个人中心上传头像等)

课程内容概要:

    1. 介绍art-template中的 子模板模板继承

    2. 介绍表单同步提交与异步提交的区别

    3. 介绍了可视化管理工具MongoBooster

    4. 介绍了blueimp/javascript-MD5的配置和使用

    5. 介绍express-session的配置与使用

    6. 注册、登录 与 退出 功能的实现


    7. 介绍 Express 中间件 原理

    8. express中的 三大类 中间件

    9. express中的 全局统一错误处理

    


注意: Node中有许多第3方模板引擎,不只有art-template,还有:

ejs (e代表effective高效之意,从json中生成html的一种魔法) 、

jade(因版权问题,后改名pug哈巴狗)、

handlebars(号称logic-less templateheima的manmanmai项目用到)、

nunjucks(是Mozilla开发的一个纯JavaScript编写的模板引擎)



首先讲art-template中的子模板(include) 以及 模板继承(extend)语法

官方文档地址 aui.github.io/art-template/zh-cn/docs/syntax.html





第1步, 新建下面4个文件 作为将来 被包含的子模板

公共的顶部public_top.html、

公共的底部public_footer.html、

公共的左侧边栏public_left.html、

公共的右广告栏public_right.html



第2步,新增 node_51_base_layout.html 作为将来被各个实际页面继承(extend)的母板

母板里面有个完整的骨架,

母板里包含(include)了公共的顶部、底部、左侧边栏、右广告栏

母板里head引入所有页面要用到的公共的css(如bootstrap)、js(如jquery)

同时,母板里,

通过block语法,在head标签中 预留了 实际页面真正要用到的 title、css、 js空间

通过block语法,在body标签中 预留了 实际页面真正要用到的html 空间

node_51_base_layout.html母板完整代码如下:

<!DOCTPYE html>  
<html lang="zh">  
<head>  
    <link rel="icon" href="public/img/beyond.jpg" type="image/x-icon"/>
    <meta charset="UTF-8">
    <meta name="author" content="beyond">
    <meta http-equiv="refresh" content="520">
    <meta name="description" content="未闻花名-免费零基础教程-beyond">
    <meta name="viewport" content="width=device-width, 
    initial-scale=1.0, maximum-scale=1.0,minimum-scale=1.0,user-scalable=0" />
    <meta name="keywords" content="HTML,CSS,JAVASCRIPT,JQUERY,XML,JSON,C,C++,C#,OC,PHP,JAVA,JSP,PYTHON,RUBY,PERL,LUA,SQL,LINUX,SHELL,汇编,日语,英语,泰语,韩语,俄语,粤语,阿语,魔方,乐理,动漫,PR,PS,AI,AE">
    <!--[if lt IE 9]>
        <script src="//apps.bdimg.com/libs/html5shiv/3.7/html5shiv.min.js"></script>
        <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/1.10.2/jquery.js">
        </script>
        <![endif]-->

    <!-- 公共的样式 -->
    <style type="text/css">
        body{
            font-size: 100%; 
            /*声明margin和padding是个好习惯*/  
            margin: 0;  
            padding: 0; 
            background-image: url("public/img/sakura4.png");  
            background-repeat: no-repeat;  
            background-position: center center;  
        }
    </style>
    <!-- 公共的样式 -->
    <link rel="stylesheet" type="text/css" href="public/css/beyondbasestylewhite5.css">
    <!-- 绿色按钮的css效果 -->
    <link rel="stylesheet" type="text/css" href="public/css/beyondbuttongreen.css">        

    <!-- 公共的JS特效 -->
    <script type="text/javascript" src="public/js/nslog.js"></script>
    <!-- jquery -->
    <script type="text/javascript" src="public/js/jquery2.1.4.js"></script>
    <!-- bootstrap -->
    <link rel="stylesheet" type="text/css" href="public/lib/bootstrap/dist/css/bootstrap.css">
    <script type="text/javascript" src="public/lib/bootstrap/dist/js/bootstrap.js"></script>

    <!-- 这个标题 要留一个坑,给后代去实现自己的title -->
    <title>
        {
  
  { block 'block_1_title'}}
            beyond心中の动漫神作
        {
  
  { /block }}
    </title>

    <!-- 这个head中要 要留一个坑,给后代去链接自己的css或js-->
    {
  
  { block 'block_2_head_css_js'}}
    {
  
  { /block }}

    </head>  
    <body>
        <!-- include进来公共的顶部、底部、左侧边栏、右广告栏 -->
        {
  
  { include './public_top.html' }}
        {
  
  { include './public_left.html' }}
        
        <!-- 这个body最后要 要留一个坑,给后代去实现自己的content-->
        {
  
  { block 'block_3_body_content'}}
                这是母板默认的正文<br/>
        {
  
  { /block }}

        {
  
  { include './public_right.html' }}
        {
  
  { include './public_footer.html' }}

        <!-- 这个body最后要 要留一个坑,给后代去实现自己的js-->
        {
  
  { block 'block_4_body_js'}}
        {
  
  { /block }}
    </body>
</html>



第3步,现在就可以新建首页node_51_index.html了 ,

该首页 继承(extend) 自 base_layout.html母板

node_51_index.html完整代码如下:

<!-- 第0步,继承母板 -->
{
  
  { extend './node_51_base_layout.html' }}

<!-- 第1步,自己的标题 -->
{
  
  { block 'block_1_title'}}
	自己的标题_首页
{
  
  { /block }}

<!-- 第2步,自己的head中的css或js -->
{
  
  { block 'block_2_head_css_js'}}
	<style type="text/css">
		body{
			background-color: rgba(166,166,166,0.1);
		}
	</style>
	<script type="text/javascript">
		alert('我是index的head中的js')
	</script>
{
  
  { /block }}

<!-- 第3步,自己的正文 -->
{
  
  { block 'block_3_body_content'}}
	自己的正文<br/>
{
  
  { /block }}

<!-- 第4步,自己的正文最后的js代码 -->
{
  
  { block 'block_4_body_js'}}
	<script type="text/javascript">
		alert('我是index的body最后的js')
	</script>
{
  
  { /block }}

入口文件node_51_index.js代码如下:

function NSLog(loli,needLogo=true) {console.log(loli);if(needLogo){console.log('\nCopyright © 2018 Powered by beyond')};}  


// 导入框架
var express = require('express')
var path = require('path')
// 创建服务器对象
var appServer = express()
// 监听端口,并启动服务
appServer.listen(5267,function (error) {
	if (error) {
		return NSLog('启动失败: ' + error)
	}
	NSLog('服务启动成功')
})
// -----------------------------------

// 静态资源请求时的 staticFileUrlPrefix
var staticFileUrlPrefix = '/public/'
// var staticFileUrlPrefix = '/public' 

// 访问也只能使用 localhost:5267/public/img/beyond.jpg
// 磁盘上的静态资源目录
var staticFilePath = './public/'   
// var staticFilePath = 'public' 

var callbackFunction = express.static(staticFilePath)
appServer.use(staticFileUrlPrefix,callbackFunction)
// 再开一个静态资源目录
appServer.use('/uploads/',express.static(path.join(__dirname,'uploads')))

// -----------------------------------

// 指明:对于 所有后缀为html 的模板文件 使用模板引擎
var templateFileSuffix = 'html'
appServer.engine(templateFileSuffix,require('express-art-template'))
// 下面这一句参数配置,可有可无
appServer.set('view options',{
	debug: process.env.NODE_ENV !== 'production'
})
// 注意:如果不想把模板文件放在默认的views目录下,则可以通过下面代码更改设置
// appServer.set('views','其他目录')

// -----------------------------------
// 使用middleware中间件body-parser进行post请求体中数据解析
var bodyParser = require('body-parser')
// 设置解析 application/x-www-form-urlencoded
appServer.use(bodyParser.urlencoded({extended: false}))        
// 设置解析 application/json
appServer.use(bodyParser.json())

// -----------------------------------
// 自定义路由设计的目的是:
// 1.让主入口程序的职责更加单一,代码更加简洁
//     1.1 创建服务
//     1.2 做一些服务相关的配置,比如:
//           1.2.1 静态资源配置
//           1.2.2 模板引擎配置
//           1.2.3 body-parse 解析表单
//           1.2.4 挂载自定义路由
//           1.2.5 监听端口,启动服务
// 使用自定义的路由模块 必须使用./
// 注意: 配置模板引擎和body-parser, 一定要在挂载路由之前
var beyondRouter = require('./node_51_router')
appServer.use(beyondRouter)

路由文件node_51_router.js代码如下:

function NSLog(loli) {console.log(loli);return 'Copyright © 2018 Powered by beyond';};  
/*
	自定义路由模块的职责是:
		专门处理所有的路由
		根据不同的请求方式和路径,采取相应的处理方法
*/ 
// express 专门提供了路由的处理方法
var express = require('express')

// ---------------使用formidable解析上传的图片--------------------
var formidable = require('formidable')
// var util = require('util')
var path = require('path')
// -----------------------------------

// 1.使用express专门提供的路由器处理路由 
var router = express.Router()

// -----------------------------------
// 时间格式化
// var BeyondDateFormatFunction = require('./BeyondDateFormat')

// ----------------首页-------------------
router.get('/',function (request,response) {
	response.render('index/node_51_index.html')
})

// 3.在模块文件最后,导出router
module.exports = router

通过node_51_index.js入口 加载 node_51_router.js路由之后

启动服务器,渲染效果如下:



Blog项目开始 

第1步. 项目初始化

        首先npm init -y ,生成package.json

        然后git init,然后手动新建.gitignore文件

第2步. npm 安装 mongoose和express和art-template和express-art-template


第3步. 项目目录

        public目录下有img和css和js和lib目录

        views目录下放着html模板, 分成了登录注册模块、文章模块

第4步. 路由设计

路由设计
请求路由 方法 GET参数 POST参数 是否需要登录权限(没用到) 备注
/ GET


首页index.html即文章列表
/register GET


注册页面register.html
/register POST
email,password,username
处理注册的POST请求
/login GET


登录页面login.html
/login POST
email,password
处理登录POST请求


首先处理的路由是 / , 渲染首页node_52_index.html

由于数据库内暂时还没有数据,所以首页只用几个假的数据先填充,以保证样式正常

首页的渲染效果如下:


首页node_52_index.html代码(暂未使用模板引擎渲染)如下:

<!-- 第0步,继承母板 -->
{
  
  { extend './node_52_base_layout.html' }}

<!-- 第1步,自己的标题 -->
{
  
  { block 'block_1_title'}}
	未闻花名_多用户博客系统_首页
{
  
  { /block }}

<!-- 第2步,自己的head中的css或js -->
{
  
  { block 'block_2_head_css_js'}}
	<style type="text/css">
		body{
			background-color: rgba(166,166,166,0.1);
		}
	</style>
	<script type="text/javascript">
		// alert('我是index的head中的js')
	</script>
{
  
  { /block }}

<!-- ||||||||||||||||||||||||||||||||| -->
<!-- 第3步,自己的正文 -->
{
  
  { block 'block_3_body_content'}}
	
	
<section class="container">
  <ul class="media-list">
    <li class="media">
      <div class="media-left">
        <a href="#">
            <img width="40" height="40" class="media-object" src="public/img/beyond.jpg" alt="...">
          </a>
      </div>
      <div class="media-body">
        <h4 class="media-heading"><a href="/topics/123">未闻花名</a></h4>
        <p>面码 发起了话题 • 1314 人关注 • 32 个回复 • 1992 次浏览 • 2006-06-07 22:20</p>
      </div>
    </li>
    <li class="media">
      <div class="media-left">
        <a href="#">
            <img width="40" height="40" class="media-object" src="public/img/beyond.jpg" alt="...">
          </a>
      </div>
      <div class="media-body">
        <h4 class="media-heading"><a href="/topics/123">龙与虎</a></h4>
        <p>逢坂大河 发起了话题 • 520 人关注
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值