Node.js 里 Express工程框架中的代码解析

news2025/3/2 1:16:56

新建一个工程

express -e blog

配置入口文件

打开项目内的app.js ,在倒数第二行写入如下代码:

app.listen('3000', function () {
  console.log('server is running in 3000')
})

这样就让服务运行在了3000端口

检查

打开终端输入:

node app

在打开浏览器访问127.0.0.1:3000

在这里插入图片描述
运行成功

了解工程结构

在这里插入图片描述
此时blog目录下的文件大概是这样的

这些文件的用处有这些:

  • app.js:启动文件,或者说入口文件
  • package.json: 储存着工程的信息以及模块依赖,当在dependencies中添加依赖的模块时,运行 npm install ,npm就会检查当前目录下的package.json,并自动安装所有指定的模块。
  • node_modules:存放package.json 中安装的模块,当在package.json中添加依赖的模块并安装后,该模块会存放在这个文件夹下。
  • public:存放image、css、js等文件
  • routes: 存放路由文件
  • views:存放视图文件,或者说模板文件

打开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 app = express();

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

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);

// 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');
});

app.listen('3000', function () {
  console.log('server is running in 3000')
})

module.exports = app;

它通过require导入了 http-errors express path cookie-parser morgan等模块,以及./routes/index ./routes/users两个本地文件。

app.set('views', path.join(__dirname, 'views'));

这行代码让views文件夹设置为存放视图文件的目录(存放模板文件的地方),__dirname是指当前文件所在的目录。

app.set(’ ', ’ ');是设置express.js所使用的render engine。

app.set('view engine', 'ejs');

这里是用了很多use方法连接了很多内置的中间件:

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')));

目录被设为了public文件夹。

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

配置了两个路由一个是/ 一个是/users 也就是routes目录下的两个文件
在这里插入图片描述

index.js:

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

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

module.exports = router;

这段的意思是使用ejs模板引擎 , 解析 index.ejs 文件(也就是前面设置的views目录下的index.ejs)。
传入了一个对象{title:‘Express’} ,这个对象只有一个title属性,意思是用title的值Express替换index.ejs中所有的title变量,这也就是渲染视图的过程。

users.js:

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

/* GET users listing. */
router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});

module.exports = router;

如果访问/ 就会由index.js 来处理 如果访问/users 就会由users.js来处理。

路由规则

express封装了多种http请求方式,我们主要使用get 和 post两种,即app.get()和app.post()。
app.get()和app.post()的第一个参数都为请求路径,第二个参数为处理请求的回调函数,回调函数有两个参数req和res,代表请求信息和响应信息。路径请求以及对应的获取路径有以下几种形式:

  • req.query 处理get请求,获取get请求参数
  • req.params 处理 /:xxx 形式的get和post请求,获取请求参数。
  • req.body 处理post请求,获取post请求体
  • req.param() 处理get和post请求,但查找优先级由高到低而req.params -> req,body -> req.query

添加路由规则

当我们访问127.0.0.1:3000 或者localhost:3000时是这样的页面:

在这里插入图片描述

如果访问不在路由配置中的地址就会报错:
在这里插入图片描述

这是因为不存在 /xiaofu 的路由规则,同时它也不是一个public目录下的文件,所以返回了错误页面。

在index.js中的函数内加一段以下代码:

 router.get('/xiaofu', function (req, res, next) {
    res.send('Hello Im XiaoFu!')
  })

在这里插入图片描述
重启服务 再次访问

在这里插入图片描述
页面就渲染上了一样一句话
这就是路由的配置。

模板引擎

模板引擎是一个将页面模板和要显示的数据结合起来生成HTML页面的工具。

在这个工程中,我们用的是ejs模板引擎。

前面我们也设置过了模板文件的位置以及它们使用的模板引擎:

app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

打开index.ejs,它的内容是这样的:

<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p>Welcome to <%= title %></p>
  </body>
</html>

当我们在路由配置时 配置这行语句时:

res.render('index', { title: 'Express' });

模板引擎就会把
< title><%= title %></t itle>
渲染为Express

渲染之后的页面代码:

<!DOCTYPE html>
<html>
  <head>
    <title> Express </title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1> Express</h1>
    <p>Welcome to  Express</p>
  </body>
</html>

注意:
因为前面我们把静态文件目录 设置为了public目录,所以这里的href的值可以不写相对或绝对路径 之间写 ‘/stylesheets/style.css’

ejs标签系统

<% code %>  => JavaScript代码
<%=code %>  => 显示替换过的HTML特殊字符的内容
<%-code %>  => 显示原始HTML内容

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

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

相关文章

client-go实战之十:标签选择(labels.Selector),重要

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 系列文章链接 client-go实战之一&#xff1a;准备工作client-go实战之二:RESTClientclient-go实战之三&#xff1a;Clientsetclient-go实战之四&#xff1a;…

智能优化算法求解CEC2005中F1-F25的种群动态变化图(视频)

CEC2005 测试集共包含 25 个测试问题, 即 f1−f25f_{1}-f_{25}f1​−f25​ 。根据问题的特征, 可进一 步将其分为 4 类: 单峰问题 f1−f5f_{1}-f_{5}f1​−f5​ , 基本多峰问题 f6−f12f_{6}-f_{12}f6​−f12​ , 扩展多峰问题 f13−f14f_{13}-f_{14}f13​−f14​ 和混合复合问…

STL源码学习(1)-空间配置器

文章目录1. SGI空间配置器1.1 std::allocator1.2 std::alloc1.3 对象构造与析构&#xff1a;construct和destroy1.4 空间配置与释放&#xff1a;allocate和deallocate1.4.1 第一级空间配置器1.4.2 第二级空间配置器1.4.2.1 空间配置函数 allocate1.4.2.2 空间释放函数 dealloca…

C++回顾(二十二)—— stack容器 与 queue容器

22.1 stack容器 &#xff08;1&#xff09; stack容器简介 stack是堆栈容器&#xff0c;是一种“先进后出”的容器。stack是简单地装饰deque容器而成为另外的一种容器。添加头文件&#xff1a;#include <stack> &#xff08;2&#xff09;stack对象的默认构造 stack…

Web漏洞-XXE漏洞(详细)

XXE漏洞XXE全称为XML External Entity Injection即XMl外部实体注入漏洞原理&#xff1a;XXE漏洞发生在应用程序解析XML输入时&#xff0c;没有禁止外部实体的加载&#xff0c; 导致用户可以控制外部的加载文件&#xff0c;造成XXE漏洞。XXE漏洞触发点往往是可以上传xml文件的位…

行测-判断推理-类比推理-逻辑关系-交叉关系

花瓶和瓷器是交叉关系&#xff0c;除了瓷花瓶&#xff0c;还有塑料花瓶等花瓶中有一部分是瓷器&#xff0c;瓷器中有一部分是花瓶A选项&#xff1a;电视机是电器的一种&#xff0c;种属关系&#xff0c;排除AB选项&#xff1a;中药和植物是交叉关系&#xff0c;还有动物入药等&…

< 开源项目框架:推荐几个开箱即用的开源管理系统 - 让开发不再复杂 >

文章目录&#x1f449; SCUI Admin 中后台前端解决方案&#x1f449; Vue .NetCore 前后端分离的快速发开框架&#x1f449; next-admin 适配移动端、pc的后台模板&#x1f449; django-vue-admin-pro 快速开发平台&#x1f449; Admin.NET 通用管理平台&#x1f449; RuoYi 若…

SpringBoot 整合 Activiti7

一.pom依赖引入 通过该 pom.xml 文件所导入的坐标&#xff0c;我们就可以实现 activiti7 与 Springboot 整合 <!--activiti7与SpringBoot整合的相关依赖--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-start…

【教学典型案例】04.生产环境app打包导致不能自动升级

目录一&#xff1a;背景介绍现象原因产生影响二&#xff1a;问题复现过程1、注册服务空间2、添加Admin项目3、创建uniapp项目4、App打包5、发布到升级中心三&#xff1a;总结一&#xff1a;背景介绍 现象 用户端安装了74版本的app&#xff0c;不能自动升级。 原因 产生该问…

win10 +cuda11.3.1+VS2019-社区版+drive445.87

参考&#xff1a;https://blog.csdn.net/kunhe0512/article/details/124331221这里的推荐离线安装包的方式进行cuda安装&#xff0c;官方也给了conda的安装方式&#xff0c;我试过一直出问题&#xff0c;所以安装包的方式比较靠谱&#xff0c;windows比linux下更方便。vs2019-c…

Uipath Excel 自动化系列20-Insert Chart(插入图表)

活动描述 Insert Chart(插入图表)&#xff1a;在Excel工作表的指定位置插入图表&#xff0c;该活动需与Use Excel File 活动选择的 Excel 文件一起使用。 使用如下图&#xff1a; Insert Chart(插入图表)属性配置 属性 作用 DisplayName 在设计器面板中设置活动显示的名称…

计算机网络笔记——计算机网络体系结构

计算机网络笔记——计算机网络体系结构1.计算机网络体系结构1.1 计算机网络概述1.1.1 计算机网络的概念1.1.2 计算机网络组成物理组成工作方式组成功能组成1.1.3 计算机网路的功能1.1.4 计算机网络的分类1.1.5 计算机网络的标准化公工作及相关组织1.2 计算机网络体系结构与参考…

Python调用Shell命令 (python,shell 混合编程)

Python经常被称作“胶水语言”&#xff0c;因为它能够轻易地操作其他程序&#xff0c;轻易地包装使用其他语言编写的库&#xff0c;也当然可以用Python调用Shell命令。 用Python调用Shell命令有如下几种方式&#xff1a; 1. os.system os.system("The command you want&…

fiddler

文章目录fiddler简介URL与HTTPURLhttp模拟测试场景弱网测试自定义规则前端性能分析及优化fiddler 简介 Fiddler是位于客户端和服务端的HTTP代理 目前最常用的http抓包工具之一功能非常强大&#xff0c;是web调试的利器 监控浏览器所有的HTTP/HTTPS流量查看、分析请求内容细节伪…

Android之屏幕适配方案

在说明适配方案之前&#xff0c;我们需要对如下几个概念有所了解&#xff1a;屏幕尺寸&#xff0c;屏幕分辨率&#xff0c;屏幕像素密度。 屏幕尺寸 屏幕尺寸指屏幕的对角线的物理长度&#xff0c;单位是英寸&#xff0c;1英寸2.54厘米。 比如常见的屏幕尺寸&#xff1a;5.0、5…

粒子群优化SVM含水率预测

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 SVM应用实例,基于粒子群改进SVM的含水率回归分析 代码 结果分析 展望 支持向量机SVM的详细原理 SVM的定义 支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性…

python --生成时间序列,作为横轴的标签。时间跨越2008-2022年,生成每年的6-10月的第一天作为时间序列

python 生成制定的时间序列作为绘图时x轴的标签 问题需求 在绘图时&#xff0c;需要对于x轴的标签进行专门的设置&#xff0c;整体时间跨越2008年-2022年&#xff0c;将每年的6-10月的第一天生成一条时间序列&#xff0c;绘制成图。 解决思路 对于时间序列的生成&#xff0…

【react 全家桶】条件渲染

文章目录05 【条件渲染】基础配置1.条件判断语句2.三目运算符3.与运算符&&4.元素变量5.阻止组件渲染05 【条件渲染】 在 React 中&#xff0c;你可以创建不同的组件来封装各种你需要的行为。然后&#xff0c;依据应用的不同状态&#xff0c;你可以只渲染对应状态下的部…

VB实现点爆炸效果

需在窗体放置以下 4 个控件&#xff0c;所有控件不用设置任何属性&#xff0c;均采用默认设置&#xff1a; ’ Picture1&#xff0c;Command1&#xff0c;Check1&#xff0c;Timer1 Option Explicit Dim I Dim ctD() As tyD, ctDs As Long, ctR As Single Private Type tyD x…

java单元测试(二)H2数据库篇

java单元测试&#xff08;二&#xff09;H2数据库篇一、什么是H2&#xff1f;二、Springboot项目集成H22.1、引入H2依赖2.2、初始化spring配置文件application.test.xml2.3、初始化H2数据库DDL/DML语句三、编写单元测试3.1、首先我们创建测试类3.2、编写测试用例3.3、测试用例一…