NodeJs实战-Express构建照片存储网站(1)-ejs视图引擎填充数据

news2024/10/7 6:43:13

ejs视图引擎填充数据

  • express 生成项目
    • 安装 express-generator
    • 生成项目
  • 程序结构理解
    • 项目结构
    • 生成的文件的含义
  • 视图渲染填充照片数据
    • 增加路由器
      • 修改 app.js
      • 修改 routes
    • 增加对应的视图页面
    • 路由器 res.render 查找视图逻辑
    • 新增文件之后的项目结构图
  • 效果图
  • 项目地址

express 生成项目

安装 express-generator

windows系统执行以下命令

npm install -g express-generator

验证是否安装成功,出现以下信息说明安装成功了

C:\Users\Administrator>express --version
4.16.1

C:\Users\Administrator>express -h

  Usage: express [options] [dir]

  Options:

        --version        output the version number
    -e, --ejs            add ejs engine support
        --pug            add pug engine support
        --hbs            add handlebars engine support
    -H, --hogan          add hogan.js engine support
    -v, --view <engine>  add view <engine> support (dust|ejs|hbs|hjs|jade|pug|twig|vash) (defaults to jade)
        --no-view        use static html instead of view engine
    -c, --css <engine>   add stylesheet <engine> support (less|stylus|compass|sass) (defaults to plain css)
        --git            add .gitignore
    -f, --force          force on non-empty directory
    -h, --help           output usage information

生成项目

  1. 执行以下命令
F:\Github\Nodejs>express --ejs --view=ejs photo

  warning: option `--ejs' has been renamed to `--view=ejs'


   create : photo\
   create : photo\public\
   create : photo\public\javascripts\
   create : photo\public\images\
   create : photo\public\stylesheets\
   create : photo\public\stylesheets\style.css
   create : photo\routes\
   create : photo\routes\index.js
   create : photo\routes\users.js
   create : photo\views\
   create : photo\views\error.ejs
   create : photo\views\index.ejs
   create : photo\app.js
   create : photo\package.json
   create : photo\bin\
   create : photo\bin\www

   change directory:
     > cd photo

   install dependencies:
     > npm install

   run the app:
     > SET DEBUG=photo:* & npm start
  1. 安装依赖
cd photo
npm install
  1. 启动服务
SET DEBUG=photo:* & npm start
  1. 浏览器访问 http://127.0.0.1:3000/,出现如图页面,项目生成成功
    在这里插入图片描述

程序结构理解

项目结构

在这里插入图片描述

生成的文件的含义

  1. app.js,主程序文件
  2. public 存储静态资源文件夹,存储客户端所需要的资源,比如js,css
  3. routes 路由器文件夹,填充页面数据的逻辑,查找对应的视图页面
  4. views 视图页面

视图渲染填充照片数据

增加路由器

修改 app.js

原来的app.js 文件生成的时候已经有两个路由器了

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

增加一个照片程序对应的路由器

var photoRouter = require('./routes/photo');

访问 /photo 的时候使用该路由器

app.use('/photo', photoRouter);

完整的 app.js

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var photoRouter = require('./routes/photo');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
// app.set('view cache', false);

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/photo', photoRouter);


// catch 404 and forward to error handler
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;

修改 routes

在 routes 文件夹下新建 photo.js, 编写router 所需执行的方法,可以参考idnex.js 写

var express = require('express');
var router = express.Router();

var photos = [];
photos.push({
    'name': 'photo1',
    'path': 'https://img1.doubanio.com/dae/niffler/niffler/images/abd3c3ec-922c-11e7-8a20-0242ac11000c.png'
});
photos.push({
    'name': 'photo2',
    'path': 'https://img9.doubanio.com/dae/niffler/niffler/images/6db31128-39dd-11e7-895e-0242ac110016.png'
});

/* GET photo page. */
router.get('/', function(req, res, next) {
  res.render('photos', { title: 'Photos', data: photos });
});

module.exports = router;

增加对应的视图页面

  1. 新建 photos 文件夹
  2. 增加 index.ejs, 复制原来 views文件下的 index.ejs
    在这里插入图片描述
<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p>照片存储应用</p>
    <div id="photos">
        <% data.forEach(item => { %>
            <div class="photo">
                <h2><%=item.name%></h2>
                <img src='<%=item.path%>'/>
            </div>
        <%})%>
    </div>
  </body>
</html>

路由器 res.render 查找视图逻辑

在这里插入图片描述

-- app.js
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
-- view/photos/index.ejs
res.render('photos', { title: 'Photos', data: photos });
Created with Raphaël 2.3.0 开始 查找绝对路径photos.ejs 是否找到? 执行视图渲染 结束 查找view/photos.ejs 是否找到? 执行视图渲染 查找view/photos/index.ejs 是否找到? 执行视图渲染 结束 返回错误 yes no yes no yes no

ejs视图引擎渲染 照片数据的逻辑如下

 <div id="photos">
        <% data.forEach(item => { %>
            <div class="photo">
                <h2><%=item.name%></h2>
                <img src='<%=item.path%>'/>
            </div>
        <%})%>
    </div>

注意: 相关js代码、取数据的部分需要用 <% %> 括起来

新增文件之后的项目结构图

在这里插入图片描述

效果图

启动服务

F:\Github\Nodejs\photo>SET DEBUG=photo:* & npm start

> photo@0.0.0 start
> node ./bin/www

  photo:server Listening on port 3000 +0ms
GET /photo 200 16.911 ms - 701
GET /stylesheets/style.css 304 2.801 ms - -

浏览器访问 http://127.0.0.1:3000/photo
在这里插入图片描述

项目地址

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

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

相关文章

kali Linux常用快捷键及vim的基本使用

kali Linux 系统快捷键 Ctrl Alt T &#xff1a;打开一个新的命令行终端。 如果是在桌面打开的是这种情况 Ctrl C 复制。 Ctrl Z 撤消。 Ctrl S &#xff1a;保存 Ctrl Q &#xff1a;退出。 终端快捷键 TAB &#xff1a;补全命令。 Ctrl &#xff1a;放大文字…

Netty系列(一):Springboot整合Netty,自定义协议实现

Netty是由JBOSS提供的一个java开源框架&#xff0c;现为 Github上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具&#xff0c;用以快速开发高性能、高可靠性的网络服务器和客户端程序。 也就是说&#xff0c;Netty 是一个基于NIO的客户、服务器端的编程框架&…

目标检测论文解读复现之十六:基于改进YOLOv5的小目标检测算法

前言 此前出了目标改进算法专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读最新目标检测算法论文&#xff0c…

Java项目使用intellij-IDEA查看依赖包版本是否有冲突(方法及工具)

编译器及版本idea-ultimate依赖管理工具maven 第一个是idea本身的 Step1&#xff1a;点击右侧的maven Step2&#xff1a;右键依赖项&#xff0c;点击分析依赖关系 Step3&#xff1a;可以在模块名位置进行切换&#xff0c;左侧三角的标志则表示该包引入了多个版本&#xff…

【云原生】Docker网络原理及Cgroup硬件资源占用控制

内容预知 1.dockers的网络模式 获取容器的进程号 docker网络模式的特性 1.1 host主机模式 1.2 container模式 1.3 none模式 1.4 bridge 桥接模式 1.5 容器的自定义网络 &#xff08;1&#xff09;未创建自定义网络时&#xff0c;创建指定IP容器的测试 &#xff08;2&a…

双坐标轴柱状图

双坐标轴柱状图 setwd(“H:/分析评价 20220531/6-分析过程”) #设置工作路径 library(xlsx)#加载excel文件包 #---------------------------------------------------------------------------------------------------------- tiff(file“1-占比.tiff”,res600,width6000,hei…

负载均衡有哪些?

目录 【一】前言 【二】负载均衡分类 2.1 DNS 2.2 硬件负载均衡 2.3 软件负载均衡 2.4 组合负载均衡 【三】负载均衡算法 3.1 负载均衡算法分类 3.2 轮询 3.3 加权轮询 3.4 负载最低优先 3.5 性能最优类 3.6 Hash 【四】总结 【一】前言 在互联网尤其是移动互联…

【前沿技术RPA】 一文了解UiPath的项目活动设置

&#x1f40b;作者简介&#xff1a;博主是一位.Net开发者&#xff0c;同时也是RPA和低代码平台的践行者。 &#x1f42c;个人主页&#xff1a;会敲键盘的肘子 &#x1f430;系列专栏&#xff1a;UiPath &#x1f980;专栏简介&#xff1a;UiPath在传统的RPA&#xff08;Robotic…

【计算机组成原理Note】5.2 指令周期的数据流

5.2 指令周期的数据流 5.2.1 指令周期 指令周期&#xff1a;CPU从主存中每取出并执行一条指令所需的全部时间。 指令周期&#xff1a;常常用若干机器周期来表示&#xff0c;机器周期又叫CPU周期。 一个机器周期又包含若干时钟周期(也称为节拍、T周期或CPU时钟周期&#xff…

SpringCloud微服务(十一)——Sentinel服务熔断限流

SpringCloud Alibaba Sentinel服务熔断与限流 简介 github&#xff1a;[https://github.com/alibaba/Sentinel/wiki/%E4%B8%BB%E9%A1%B5](https://github.com/alibaba/Sentinel/wiki/如何使用) 官网&#xff1a;https://spring-cloud-alibaba-group.github.io/github-pages/…

为什么追踪员工的时间和出勤率很重要

监控员工的出勤时间和出勤率对于提高业务绩效和生产力至关重要。实施有效计时策略的组织可以帮助员工跟上项目目标和截止日期&#xff0c;提高客户满意度&#xff0c;并加强对员工产出的整体意识。所以每个企业组织都应该掌握员工出勤时间和出勤数据。 为什么要掌握员工出勤时…

阿里架构师耗时 1 年,把 P8 所需要的整个 Java 体系,都整理到了一起

有人调侃我们说&#xff1a; 程序员不如送外卖。送外卖是搬运食物&#xff0c;自己是搬运代码&#xff0c;都不产出新的东西…… 透支体力&#xff0c;又消耗健康&#xff0c;可替代性极强&#xff0c;30 岁之后就要面临被优化的危险…… 想跳槽&#xff0c;但是更高的平台难…

微信小程序怎么弄?【小程序制作】

微信小程序怎么弄&#xff1f;很多人都会想弄一个微信小程序&#xff0c;因为微信小程序这个轻应用现在的使用频率已经赶上微信了&#xff0c;有如此大的用户群体&#xff0c;企业和商家当然都想在这个庞大流量池里分一杯羹。那么微信小程序怎么弄呢&#xff1f;下面一起来看看…

群签名、环签名、盲签名

文章目录群签名定义安全性构造环签名定义安全性构造盲签名定义安全性构造群签名 定义 群签名方案是算法组 ΠGS(Gen,Sign,Ver,Open)\Pi_{GS}(Gen, Sign, Ver, Open)ΠGS​(Gen,Sign,Ver,Open)&#xff0c; Gen(1λ,n)Gen(1^\lambda,n)Gen(1λ,n)&#xff1a;密钥生成算法&…

百度Q3财报显AI技术厚度,“慢生意”稳步驶入“快车道”

一周前&#xff0c;笔者参加了一场百度主办的关于AIGC话题的沙龙&#xff0c;因为话题无比火爆&#xff0c;活动延迟到了一点钟才结束&#xff0c;以至于让约定的好友饭局也一等再等。 倒没有丝毫抱怨的意思&#xff0c;正是这个烧脑的活动&#xff0c;让我感受并体验到了当下最…

GEE开发之Modis_LAI数据分析和获取

GEE开发之Modis_LAI数据分析和获取1.遥感卫星数据叶面积指数LAI2.MOD15A2H(500m/8天)2.1 MOD15A2H下的指数2.2 LAI遥感影像查看获取3.LAI日数据下载4.LAI月数据下载5.LAI年数据下载前言&#xff1a;主要介绍LAI的概念&#xff0c;以及GEE下如何获取查看Modis下的LAI指数&#x…

Talk | 清华大学陈晓宇苏黎世联邦理工黄嘉伟 :基于实际应用的强化学习

本期为TechBeat人工智能社区第455期线上Talk&#xff01; 北京时间11月17日(周四)20:00&#xff0c;清华大学交叉信息研究院在读博士生——陈晓宇与苏黎世联邦理工大学计算机科学在读博士生——黄嘉伟的Talk将准时在TechBeat人工智能社区开播&#xff01; 他们与大家分享的主题…

NC发布猕猴大脑皮层多组学细胞图谱,助力神经系统疾病研究 | 时空专辑数据库

近日&#xff0c;杭州华大生命科学研究院&#xff08;以下简称杭州华大&#xff09;联合昆明理工大学灵长类转化医学研究院、美国艾伦脑科学研究所等国内外多家单位在国际学术期刊《自然通讯》&#xff08;Nature Communications&#xff09;在线发表题为《成年猕猴大脑皮层空间…

PyTorch深度学习实践——线性模型、梯度下降算法、反向传播

1、线性回归 参考资料1&#xff1a;https://blog.csdn.net/bit452/article/details/109627469 参考资料2&#xff1a;http://biranda.top/Pytorch%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0003%E2%80%94%E2%80%94%E7%BA%BF%E6%80%A7%E6%A8%A1%E5%9E%8B/#%E7%BA%BF%E6%80%A7%E6%A8%…

PC_多处理器

文章目录多处理器单指令单数据流SISD结构单指令流多数据流SIMD结构向量处理器多指令流单数据流MISD结构多指令多数据流MIMD结构小结硬件多线程细粒度多线程粗粒度多线程同时多线程多核处理器共享内存多处理器多处理器 常规的单处理器属于SISD常规多处理器属于MIMD 单指令单数…