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/7723770d79a64698a14dddd59a203db9.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;

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

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

相关文章

力扣热题100道-双指针篇

文章目录 双指针283.移动零11.盛最多水的容器15.三数之和42.接雨水 双指针 283.移动零 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 …

webrtc turn服务器搭建

测试环境ubuntu 22LTS 首先从github上下载源码编译 GitHub - coturn/coturn: coturn TURN server project 用的tag docker/4.6.2-r7 ./configure --prefix /usr/local/coturn make 安装coturn的时候还需要安装一些依赖包 apt-get install pkg-config apt-get install op…

linux(centos)相关

文件架构&#xff1a; 用户组 查看用户组中的用户&#xff01; 用户 切换用户&#xff1a;su 提高用户权限命令&#xff1a;sudo 进程状态命令&#xff1a;top 杀死进程&#xff1a;kill 关机命令:shutdown 重启命令&#xff1a;reboot 时间同步 目录命令 ls pwd rm mv … 软连…

Caffeine--缓存组件

Caffeine 概念缓存手动加载自动加载手动异步加载自动异步加载 驱逐策略基于容量基于时间基于引用 移除显式移除 概念 Caffeine是一个基于Java8开发的提供了近乎最佳命中率的高性能的缓存库。与ConcurrentMap有点相似。最根本的区别是ConcurrentMap将会持有所有加入到缓存当中的…

Three.js基础入门介绍——Three.js学习三【借助控制器操作相机】

在Three.js基础入门介绍——Three.js学习二【极简入门】中介绍了如何搭建Three.js开发环境并实现一个包含旋转立方体的场景示例&#xff0c;以此为前提&#xff0c;本篇将引进一个控制器的概念并使用”轨道控制器”&#xff08;OrbitControls&#xff09;来达到从不同方向展示场…

【Java基础系列】equals方法使用与总结

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

网络IP地址如何更改?怎么使用动态代理IP提高网速?

网络IP地址更改以及使用动态代理IP提高网速的步骤如下&#xff1a; 一、更改IP地址 1. 打开浏览器&#xff0c;输入路由器登陆地址并登陆路由器后台管理界面。 2. 找到“高级设置”或“无线设置”或“VPN设置”一栏&#xff0c;点击“断开”&#xff0c;即可断开网络&#xff0…

RDD键值对的应用——一个简单的例子对比用与不用键值对的差别

有关RDD编程&#xff08;Python版&#xff09;的基础操作可参考&#xff1a;spark&#xff1a;RDD编程&#xff08;Python版&#xff09; 初看题目 先来看一道比较简单的用 pyspark交互式环境的编程题目&#xff1a; 该数据集包含了某大学计算机系的成绩&#xff0c;数据格…

CamSim相机模拟器:极大加速图像处理开发与验证过程

随着图像处理技术的不断发展&#xff0c;相机模拟在图像处理开发和验证中扮演着越来越重要的角色。相机模拟能够模拟真实相机的成像过程&#xff0c;提供高质量的图像输入&#xff0c;使开发人员能够更好地评估和调整图像处理算法。本文将探讨如何通过相机模拟来加速图像处理的…

Docker的基础使用

Docker的基础使用 Docker 是一个开放平台&#xff0c;用于开发、运输和运行应用程序。Docker 允许你将应用程序与基础架构分离&#xff0c;从而可以像管理应用程序一样快速交付软件。以下是 Docker 的详细使用指南&#xff1a; 安装 Docker 下载 Docker : 根据你的操作系统…

vue实现H5拖拽可视化编辑器

一款专注可视化平台工具&#xff0c;功能强大&#xff0c;高可扩展的HTML5可视化编辑器&#xff0c;致力于提供一套简单易用、高效创新、无限可能的解决方案。技术栈采用vue和typescript开发, 专注研发创新工具。 <template><div:style"style":class"…

MYSQL数据库的安全管理-数据库实验六

Mysql数据库实验及练习题相关 MySQL 数据库和表的管理-数据库实验一 MySQL连接查询、索引、视图-数据库实验二、实验三 MySQL约束、触发器-数据库实验四 MYSQL存储过程和存储函数-数据库实验五 MySQL批量随机生成name、TEL、idNumber MYSQL数据库的安全管理-数据库实验六 MYSQ…

msvcr120.dll丢失的解决方法

msvcr120.dll丢失的解决方法 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我将为大家分享一个常见但可能令人头痛的问题的解决方法——“msvcr12…

<JavaEE> TCP 的通信机制(二) -- 连接管理(三次握手和四次挥手)

目录 TCP的通信机制的核心特性 三、连接管理 1&#xff09;什么是连接管理&#xff1f; 2&#xff09;“三次握手”建立连接 1> 什么是“三次握手”&#xff1f; 2> “三次握手”的核心作用是什么&#xff1f; 3&#xff09;“四次挥手”断开连接 1> 什么是“…

【JavaWeb】函数式接口(学习笔记)

一、函数式接口概述 定义&#xff1a;有且只有一个抽象方法 注解&#xff1a;FunctionalInterface 函数式接口作为参数&#xff1a;Lambda表达式作为参数传递 函数式接口作为返回值&#xff1a;Lambda表达式作为结果返回 二、Supplier接口 Supplier<T>&#xff1a;…

Ubuntu安装WordPress并使用Nginx作为Web服务器

在Ubuntu上安装和配置WordPress并使用Nginx作为Web服务器&#xff0c;以下是一个简单的操作流程&#xff1a; 步骤 1: 安装Nginx bashCopy code sudo apt update sudo apt install nginx 启动Nginx并设置开机自启&#xff1a; sudo systemctl start nginx sudo systemctl e…

第2课 用FFmpeg读取rtmp流并显示视频

这节课我们开始利用ffmpeg和opencv来实现一个rtmp播放器。播放器的最基本功能其实就两个:显示画面和播放声音。在实现这两个功能前&#xff0c;我们需要先用ffmpeg连接到rtmp服务器&#xff0c;当然也可以打开一个文件。 1.压缩备份上节课工程文件夹为demo.rar&#xff0c;并修…

版权登记是怎么个流程?都需要准备些什么材料?

版权登记是指按照规定的程序和条件&#xff0c;向版权局或相关机构提交申请&#xff0c;对作品进行登记和记录的过程。版权登记是一种法律手段&#xff0c;旨在保护创作者的权益和作品的完整性&#xff0c;防止盗版和侵权行为。 版权登记的申请范围包括但不限于文字作品、口述…

ZETA落地合肥、宜城南方水泥,纵行科技携手中才邦业助力水泥企业数智化管理

近日&#xff0c;合肥南方水泥、宜城南方水泥落地ZETA预测性维护方案&#xff0c;通过在水泥厂内搭建ZETA网络&#xff0c;并在B类及C类主辅机设备上安装ZETA系列端智能传感器&#xff0c;进行数据采集和监测设备运行状态、以及早期故障警报和诊断&#xff0c;实现水泥生产设备…

web期末大作业--网页设计 HTML+CSS+JS(附源码)

目录 一&#xff0c;作品介绍 二.运用知识 三.作品详情 四.部分作品效果图 我的&#xff1a;​编辑 五.部分源代码 六.文件目录 七.源码 一&#xff0c;作品介绍 作品介绍&#xff1a;该作品是一个是一个关于影视作品的网页&#xff0c;一共有五个页面&#xff0c;主页&a…