node.js express框架开发入门教程
文章目录
- 前言
- 一、Express 生成器(express-generator)
- 二、快速安装
- 1.express框架+express-generator生成器安装
- 2.使用pug视图引擎创建项目,projectName 为项目名称自定义
- 三、安装热更新插件 nodemon
- 四、目录结构
- 1. public文件夹
- 2.routes路由
- 其他请求方式:
- 入参
- 3. view 模版引擎
- 4.app.js
- 五、app.js内部代码解读
前言
node.js express框架开发入门教程,包括express-generator生成器、nodemon、基础路由、中间件、模版引擎介绍、app.js解读等
一、Express 生成器(express-generator)
使用express-generator,能快速创建应用程序骨架,类似vue脚手架帮我们搭建项目结构,并在基础上进行开发调试运行。
二、快速安装
1.express框架+express-generator生成器安装
npm install express express-generator -g
需要注意express必须全局-g安装才能识别后面的express命令
2.使用pug视图引擎创建项目,projectName 为项目名称自定义
express projectName --view=pug
也可以使用其他模版引擎例如jade、mustache、dust、ejs等,不加--view=pug默认jade引擎,官方已弃用,现在推荐用pug。
模版引擎主要用来服务端渲染HTML,在运行时,模板引擎将模板文件中的变量替换为实际值,并将模板转换为发送给客户端的 HTML 文件
cd projectName
加载依赖
npm install
启动项目
npm start
端口号默认3000,浏览器输入http://localhost:3000出现如下界面即可表示项目启动成功
](https://img-blog.csdnimg.cn/direct/46210d1d64e14e95bda68a3ff8cda906.png)
三、安装热更新插件 nodemon
生成器默认修改代码保存后不更新需要安装nodemon插件来支持热更新
安装插件
npm install nodemon --save
修改启动配置
package.json:
"scripts": {"start": "nodemon ./bin/www"},
重新 npm start 启动生效
四、目录结构
├── app.js ---初始化入口
├── bin
│ └── www ---运行文件
├── package.json ---配置
├── public ---静态资源
│ ├── images
│ ├── javascripts
│ └── stylesheets
│ └── style.css
├── routes ---路由
│ ├── index.js
│ └── users.js
└── views ---模版引擎,生成html页面├── error.pug├── index.pug└── layout.pug
1. public文件夹
public 静态资源文件夹,放置图片、js脚本或css资源文件等,在app.js通过设置
app.use(express.static(path.join(__dirname, 'public')));
可以直接访问服务器静态资源,例如:http://localhost:3000/images/a.jpg

可以自定义路径前缀
app.use('/static',express.static(path.join(__dirname, 'public')));
访问地址变为
http://localhost:3000/static/images/a.jpg
需要注意的express.static 内置中间件函数需要在路由设置前面执行才能生效
2.routes路由
routes文件夹放置所有路由文件,并在app.js引入。项目默认内置routers/index.js、routers/user.js2个路由文件,可按 需添加例如, 新建demo.js文件

写入
var express = require('express');
var router = express.Router();//get请求
router.get('/login', function(req, res, next) {res.send('login')
});//post请求
router.post('/login', function(req, res, next) {res.send({code:200,msg:'success'})
});module.exports = router;
通过app.use(url,router)在app.js引入使用
app.use('/demo',demoRouter)
访问:http://localhost:3000/demo/login

其他请求方式:
router.post(),
router.put(),
router.delete()
router.all()
router.all()将匹配所有的请求方式,例如定义了router.all(‘/login’,(req,res,next)=>{}),
客户端不管是用get或者post或put请求/login接口都将匹配all执行相应响应逻辑
入参
function(req, res, next){
}
req:请求对象/请求体
常见属性:req.query:get请求参数 /login?name=xl&age=20req.body:post请求参数 {name:xl,age20}req.params: 匹配动态路由参数 /login/:idreq.method: 请求方式req.url :请求路由req.get 获取指定的请求头字段 req.get('content-type')
res:响应对象/响应体
常见属性:res.set:设置响应头字段 res.set('Content-Type', 'text/plain')res.status 设置响应状态码 res.status(403)res.json 向客户端发送json数据类型 res.json({data:true})res.send 向客户端发送任何数据类型res.sendFile 向客户端发送文件 res.sendFile(path [, options] [, fn])res.render view模版文件 HTML 字符串发送到客户端 res.render(view [, locals] [, callback])
next:进入下个中间件回调,没有执行任何响应(res.sendxxxx或res.json)且没调用next(),请求将被挂起。调用了next(),代码将进入下一个中间件
3. view 模版引擎
模版引擎作用是通过模版语法把代码转换为html字符串返回给客户端渲染出html页面
在app.js可以看到如下代码:
var indexRouter = require('./routes/index');
.....
.....
app.set('views', path.join(__dirname, 'views'));//设置模版引擎文件夹
app.set('view engine', 'pug');//设置pug为模版引擎
.....
......
app.use('/', indexRouter);
指定了模版文件夹views和使用pug作为引擎,当浏览器访问http://localhost:3000,匹配路由/加载
routes/index.js:
/* GET home page. */
router.get('/', function(req, res, next) {res.render('index', { title: 'Express' });
});
通过res.render返回views/index.pug 模版给客户端渲染,传入动态值title=‘Express’
views/index.pug代码如下 :
extends layoutblock contenth1= titlep Welcome to #{title}
extends layout继承了views/layout.pug 模版内容
doctype html
htmlheadtitle= titlelink(rel='stylesheet', href='/stylesheets/style.css')bodyblock content
并在body添加了h1标签内容为title,p标签内容为Welcome to #{title}
转换为html就是
<h1>Express</h1>
<p>Welcome to Express</p>
浏览器访问http://localhost:3000将显示如下界面:

至于模版引擎语法对应查看相应官方文档
4.app.js
app.js为项目入口文件,初始化执行。
var app = express();
通过express()生成实例
app实例常用方法:
1.app.set(name,value)
将设置 name 分配给 value ,例如
app.set('views', path.join(__dirname, 'views'));// 设置模版文件夹
app.set('view engine', 'pug');// 设置模版引擎
2.app.use([path,] callback [, callback…])
在指定路径挂载指定的中间件函数或函数:当请求路径的基数与 path 匹配时执行中间件函数。
app.use((req, res, next) => {console.log('Time: %d', Date.now())next()
})
3.app.listen(path, [callback])
绑定并监听指定主机和端口上的连接。此方法与 Node 的 http.Server.listen() 相同
app.listen(3000,()=>{console.log('访问地址http://localhost:3000')
})
express常见方法:
| 方法 | 描述 |
|---|---|
| express.json | 使用 JSON 有效负载解析传入请求,并且基于 body-parser |
| express.static | 提供静态文件 |
| express.Router | 创建一个新的 router 对象 |
| express.urlencoded | 使用 urlencoded 有效负载解析传入的请求,并且基于 body-parser。 |
例如:
1、设置解析请求传参编码格式为’content-type’:‘application/json’
var app = express();
app.use(express.json());//请求参数为json格式,通过res.body能获取到参数,如果不设置将获取到undefined
2、设置解析请求传参编码格式为’ application/x-www-form-urlencoded’
var app = express();
app.use(express.urlencoded({ extended: false }));//请求参数为query参数?a=1&b=2
extended设置false和true区别为:
false:采用querystring库解析参数,value是string类型无法解析嵌套多层
true:采用qs库解析参数,value是任意数据类型可以解析嵌套多层
3.设置静态文件
var app = express();
app.use(express.static('public'))
app.use(express.static('static'))
4.使用路由
var router = express.Router();
router.get('/', function(req, res, next) {res.render('index', { title: 'Express' });
});
ps:1-3点都必须在使用路由前调用才会生效,也即中间件需要在路由匹配前使用,因为一旦路由路径匹配到如果不调用next(),直接给客户端作出响应后面代码就不执行了
五、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');//生成express实例
var app = express();// 设置模版引擎目录,指定模版引擎
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');app.use(logger('dev'));//使用运行日志中间件
app.use(express.json());//解析json格式参数
app.use(express.urlencoded({ extended: false }));//解析query形式参数
app.use(cookieParser());//使用cookie中间件
app.use(express.static(path.join(__dirname, 'public')));//设置public为静态文件目录app.use('/', indexRouter);//注册路由
app.use('/users', usersRouter);//注册路由// 404中间件
app.use(function(req, res, next) {next(createError(404));
});// 处理错误中间件
app.use(function(err, req, res, next) {// set locals, only providing error in developmentres.locals.message = err.message;res.locals.error = req.app.get('env') === 'development' ? err : {};// render the error pageres.status(err.status || 500);res.render('error');
});module.exports = app;相关文章:
node.js express框架开发入门教程
文章目录 前言一、Express 生成器(express-generator)二、快速安装1.express框架express-generator生成器安装2.使用pug视图引擎创建项目,projectName 为项目名称自定义 三、安装热更新插件 nodemon四、目录结构1. public文件夹2.routes路由其他请求方式…...
Spring系列学习二、Spring框架的环境配置
Spring框架的环境配置 一、Java环境配置二、 Spring框架的安装与配置三、Maven与Gradle环境的配置四、IDE环境配置(Eclipse与IntelliJ IDEA)五、结语 一、Java环境配置 所有编程旅程总是得从基础开始,如同乐高积木大作的基座,首先…...
基于飞浆OCR的文本框box及坐标中心点检测JSON格式保存文本
OCR的文本框box及JSON数据保存 需求说明 一、借助飞浆框出OCR识别的文本框 二、以圆圈形式标出每个框的中心点位置 三、以JSON及文本格式保存OCR识别的文本 四、以文本格式保存必要的文本信息 解决方法 一、文本的坐标来自飞浆的COR识别 二、借助paddleocr的draw_ocr画出…...
ubuntu 安装docker GPG error缺少公钥解决方法
文章目录 报错信息解决方案 报错信息 W: GPG error: http://mirrors.aliyun.com/docker-ce/linux/ubuntu focal InRelease: The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY 7EA0A9C3F273FCD8 E: The repository ‘http:…...
Laravel的知识点
1.{{ }} 是在 HTML 中内嵌 PHP 的 Blade 语法标识符,表示包含在该区块内的代码都将使用 PHP 来编译运行。 2.两种写法 3.return void 在这段注释中,"return void" 表示该函数或方法没有返回值。这意味着它执行某些操作或任务,但…...
STM32 基础知识(探索者开发板)--103讲 通用定时器
定时器溢出时间计算方法: Tout ((arr 1) * (psc 1)) / Ft us arr:自动重装载值 psc:时钟预分频数 定时器相关实验通用步骤 1.定时器初始化 a.定义结构体句柄 b.设基地址 c.设分频系数 d.设自动重装载值 e. 设计数模式 f.初始化定时器 2.外设模式配置 a.设置模式 d.映…...
mysqld_exporter使用
下载自己解压好 https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.1/mysqld_exporter-0.15.1.linux-amd64.tar.gz在需要监控的数据库上执行 CREATE USER monit_test* IDENTIFIED BY Sfn4ZCHsK WITH MAX_USER_CONNECTIONS 3; GRANT PROCESS, REPLICATI…...
Java 解决远程调用 ssl 证书认证问题
Java 解决远程调用 ssl 证书认证问题 方法 1方法 2方法 3 方法 1 在 jdk 目录导入证书。 首先要下载 服务器 ssl 证书,下载完成之后。把它命名成 Root.cer 后面使用 cmd 命令行 在 jdk 目录导入。 例如 : jdk 的目录为:D:\JetBranins\Intel…...
kubernetes(k8s) Yaml 文件详解
YAML格式:用于配置和管理,YAML是一种简洁的非标记性语言,内容格式人性化,较易读。 1、查看API 资源版本标签 kubectl api-versions 2、编写资源配置清单 kubectl create -f nginx-test.yaml --validatefalse 2.3 查看创建的po…...
手拉手后端Springboot整合JWT
环境介绍 技术栈 springbootmybatis-plusmysqljava-jwt 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 1.8 Spring Boot 2.7.13 mybatis-plus 3.5.3.2 Json Web令牌简称JWT Token是在服务端产生的一串字符串是客户端访问资源接口(AP)时所需要的资源凭证。…...
小狐狸GPT付费2.4.9 去除授权弹窗版
后台安装步骤: 1、在宝塔新建个站点,php版本使用7.2 、 7.3 或 7.4,把压缩包上传到站点根目录,运行目录设置为/public 2、导入数据库文件,数据库文件是 /db.sql 3、修改数据库连接配置,配置文件是/.env 4、…...
Scrapy爬虫中合理使用time.sleep和Request
概述 在Scrapy爬虫中,我们需要深入分析time.sleep和Request对象对并发请求的影响。time.sleep函数用于在发起请求之前等待一段时间,而Request对象用于发送HTTP请求。我们必须仔细考虑这些操作对其他并发请求的潜在影响,以及在异步情况下可能…...
在Spring Cloud中使用Ribbon完成一个简单的负载均衡demo
Spring Cloud系列断更了有一段时间了,这段时间最近都在忙着项目上的事,天天修复bug以及调整需求,反正各种操劳,了解业务需求,然后开发相关功能,很久都没碰Spring Cloud系列的相关文章了,最近回头…...
mysql-5.6.16的内存泄漏问题
一、背景 有一台物理机上一个版本为5.6.16的从库出现了内存的增高,观测其日志可以发现,这台数据库已经oom很多次了,并且stop slave的时候会卡住非常长的时间才能停止 二、根本原因 上述的现象可以看到是一个明显的内存泄漏现象,…...
相机内参标定理论篇------相机模型选择
相机种类: 当拿到一款需要标定内参的相机时,第一个问题就是选择那种的相机模型。工程上相机类型的划分并不是十分严格,一般来说根据相机FOV可以把相机大概分为以下几类: 长焦相机:< 标准相机:~&…...
java设计模式学习之【状态模式】
文章目录 引言状态模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用状态示例代码地址 引言 设想你正在使用一个在线视频播放器观看电影。随着你的互动,播放器可能处于不同的状态:播放、暂停、缓冲或结束。每个状态下,播放…...
使用aspose.Words更新表格列宽
public static bool UpdateTableStyle(string filePath) { try { Document doc new Document(); //样式 Style style doc.Styles.Add(StyleType.Paragraph, "cellStyle"); style.Font.Name "simsun"; PageSetup pageSet doc.Sections[0].PageSetup; pa…...
pycharm 工具栏不见了
新版pycharm后, 菜单栏和工具栏不见了 目录 我发现的解决方法: 其他旧版的解决方法: 我发现的解决方法: 其他旧版的解决方法: 另外,一些使用pycharm的新手可能会由于不熟悉软件的功能而误操作ÿ…...
图灵日记之java奇妙历险记--类和对象
目录 类的定义和使用类的定义格式 类的实例化类和对象的说明 this引用this引用的特性 对象的构造及初始化就地初始化构造方法 封装包导入包中的类自定义包 static成员static修饰成员变量static修饰成员方法 代码块代码块概念及分类构造代码块静态代码块 匿名对象 类的定义和使用…...
Kotlin 枚举类
使用 enum 修饰符;每个枚举常量都是一个对象,枚举常量以逗号分隔 // 枚举类 enum class Direction {NORTH, SOUTH, WEST, EAST }// 每一个枚举都是枚举类的实例,所以可以这样初始化 enum class Color(val rgb: Int) {RED(0xFF0000),GREEN(0x…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
