node-express学习总结

news2025/1/12 4:02:43

项目搭建

1. 使用express提供的框架构建(不需要)
2. 从零开始(推荐)

安装

初始化项目

npm  init -y

安装express

npm install express

1.express的基本使用

创建js文件

const express = require('express')
// 1,创建服务器,express本质是一个函数
const app = express()
// login的post请求,home的get请求
app.post('/login',(req,res)=>{
    res.end("hello login")
})
app.get('/home',()=>{
    res.end("hello home")
})
// 2,开启监听
app.listen(9000,()=>{
    console.log("服务启动成功~");
})

node启动文件
此时我们可以使用postman或者浏览器测试接口 http://localhost:9000/home

2.认识中间件

const express = require('express')
const app = express()
// 什么是中间件?在下面的get请求的回调函数就是一个中间件
app.get('/home',(req,res,next)=>{
    res.end("hello home")
    // 1,我们可以在中间件执行任何代码
    // 2,我们可以修改 req,res对象
    req.aaa = 'aaa'
    // 3,可以结束响应,或挂起响应(当没有res.end或者res.json时)
    // 4,调取下一个中间件
    next()
})
// 普通的中间件
app.use(()=>{
    console.log('second middle exec');
})
app.listen(9000,()=>{
    console.log("服务启动成功~");
})

在这里插入图片描述

3.普通中间件

const express = require('express')
const app = express()

// 普通的中间件
// 无论什么请求都会匹配上use注册普通中间件
// 当存在多个中间件时,只会执行第一个,后面的会不会执行取决于第一个有没有调用next()
app.use((req,res,next)=>{
    console.log('middle exec 01');
    // res.end('请求结束')
    // next()
})
app.use((req,res,next)=>{
    console.log('middle exec 02');
})
app.listen(9000,()=>{
    console.log("服务启动成功~");
})

4.路径限制中间件

const express = require('express')
const app = express()

// 匹配路径的中间件
// 只有home路径才能匹配,但是不区分请求方法,任何方法都能匹配上
app.use('/home',(req,res,next)=>{
    console.log('home middle exec ');
    res.end('----')
})

app.listen(9000,()=>{
    console.log("服务启动成功~");
})

5.路径及方法限制中间件

const express = require('express')
const app = express()

// 对methods,path都有限制
// app.methods(path,()=>{})
app.get('/home',(req,res,next)=>{
    console.log('home middle exec ');
    res.end('----')
})

app.listen(9000,()=>{
    console.log("服务启动成功~");
})

6.注册多个中间件

const express = require('express')
const app = express()
// 应用场景:当这个请求特别复杂时,我们可以把业务拆分到不同中间件
// app.methods(path,中间件1,中间件2,中间件3,中间件...)
app.get('/home',(req,res,next)=>{
    console.log('01 ');
    // 调取下一个中间件需要next()
    next()
},(req,res,next)=>{
    console.log('02 ');
},(req,res,next)=>{
    console.log('03 ');
},(req,res,next)=>{
    console.log('04 ');
})

app.listen(9000,()=>{
    console.log("服务启动成功~");
})

7.中间件匹配规则

当你书写了很多中间件,你发送一个请求,他会按照代码书写顺序依次匹配(普通中间件与路径及方法中间件一视同仁),先执行代码最上面的中间件,后续匹配上的中间件有没有执行取决于上一个匹配中间件有没有调next()

8.应用中间件-处理请求参数(express内置)

const express = require('express')
const app = express()
// 应用中间件
// 处理json数据
app.use(express.json())
// 处理urlencode数据
// 默认使用是querystring模块有过期提示,配置extended: true使用qs模块
app.use(express.urlencoded({extended: true}))
app.post('/home',(req,res,next) => {
    // 直接在req.body获取处理好的数据
    console.log(req.body);
})
app.listen(9000,()=>{
    console.log("服务启动成功");
})

9.应用中间件-打印日志

const fs = require('fs')
const express = require('express')
// 安装导入morgan
const morgan = require('morgan')
const app = express()
const writeStream = fs.createWriteStream('./log/access.log')
// 应用中间件
app.use(morgan('combined',{stream:writeStream}))
app.post('/home',(req,res,next) => {
    
    res.end('请求成功')
})
app.listen(9000,()=>{
    console.log("服务启动成功");
})

10.应用中间件-文件上传

const express = require('express')
// 安装导入multer
const multer = require('multer')
const app = express()

// 应用中间件
const upload = multer({
    storage: multer.diskStorage({
        // 存储位置
        destination(req,file,callback) {
            callback(null, './uploads')
        },
        // 存储名称
        filename(req,file,callback) {
            callback(null,file.originalname)
        }
    })
})

app.post('/home',upload.array('home') ,(req,res,next) => {
    console.log(req.files);
    res.end('请求成功')
})
app.listen(9000,()=>{
    console.log("服务启动成功");
})

11.响应数据

const express = require('express')
const app = express()


app.post('/home',(req,res,next) => {
    //方式一:使用最少
    // res.end('请求成功')
    //方式二:推荐使用
    // res.json({
    //     message: 'ok',
    //     statusCode: 0,
    //     data: [
    //         {
    //             name:'zhao'
    //         }
    //     ]
    // })
    // status方法,用于设置状态码
    res.status(201)
    res.end('请求成功')
})
app.listen(9000,()=>{
    console.log("服务启动成功");
})

12.express中路由的使用

我们在开发中,业务逻辑是非常大的,不能全部写在app中

  1. router/userRouter.js
const express = require('express')
// 创建路由对象
const userRouter = express.Router()

// 定义路由对象中的映射接口
userRouter.get('/',(req,res,next)=>{
    res.json('获取数据成功')
})
userRouter.delete('/:id',(req,res,next)=>{
    res.json('删除某个数据成功'+req.params.id)
})
// 导出
module.exports = userRouter
  1. app
const express = require('express')
const userRouter = require('./router/userRouter')
const app = express()

// 应用路由对象
app.use('/user',userRouter)
app.listen(9000,()=>{
    console.log("服务启动成功");
})

13.express部署静态资源服务器

对于一些图片啥的,用户不能直接在浏览器查看,使用express内置中间件,可以域名加文件名查看

const express = require('express')
const app = express()
// 内置的中间件,直接将一个文件夹作为静态资源
app.use(express.static('./uploads'))

app.listen(9000,()=>{
    console.log("服务启动成功");
})

http://localhost:9000/avatar2.png 访问图片
也可以部署我们之前做过的项目,把打包好的dist文件夹放到express.static()中,可以直接访问

14.express错误处理

在常规的服务器开发中,后端处理错误信息主要是两种方式

  1. 修改res.status,比如没有权限把status修改完401
  2. 还有一种是不修改status,依旧返回200.在返回体中加一个code进行判断,比如正确是code = 0 其他错误code = -1001
    在express中我们也要处理错误
const express = require('express')
const app = express()

app.use(express.json())
app.post('/login',(req,res,next)=>{
    const {username, password} = req.body
    if (!username || !password) {
    // 错误处理代码写在这里太臃肿了
        next(-1001)
    } else if(username !== 'zhao' || password !== '123456') {
        next(-1002)
    } else {
        res.json({
            code: 0,
            message: '登录成功'
        })
    }
})
// 处理错误,四个参数
app.use((err,req,res,next)=>{
    const code = err
    let message = '未知错误'
    switch (code) {
        case -1001:
            message = '请输入账号密码'
            break;
        case -1002:
            message = '账号密码错误'
            break;
        default:
            break;
    }
    res.json({code,message})
})
app.listen(9000,()=>{
    console.log("服务启动成功");
})

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

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

相关文章

SSL/TLS类安全漏洞及SLB安全漏洞问题

SSL/TLS类安全漏洞及SLB安全漏洞问题1 : 问题背景1.1、SSL/TLS类漏洞-Sweet32 攻击1.2、SSL/TLS类漏洞-弱密码套件2 : 解决思路2.1、学习SSL/TLS是什么2.2、安装检测工具2.3、升级OpenSSL2.4、调整加密算法3 : 总结3.1、比较环境的不同3.2、解决该问题3.3、相关资源1 : 问题背景…

创建进程与进程地址空间

目录 创建进程 进程地址空间 为什么要用虚拟地址呢? 什么是进程地址空间? 为什么要写时拷贝呢? 创建进程 前面提到使用fork可以创建子进程,现在介绍fork创建子进程的细节。 fork创建子进程的时候,子进程的内核数…

如何给公司内网搭建一个专用的DNS服务器?

如何给公司内网搭建一个专用的DNS服务器? 引言 平时做域名解析,一般直接修改的/etc/hosts文件。对于服务器数量小的情况完全可以,但是如果服务器数量较多,每个都修改比较麻烦。 DNS是作为域名解析。在实际的生产过程中&#xff…

基于ASP.NET C#的服装商城管理系统

摘 要 本毕业设计的内容是设计并且实现一个基于net语言的服装商城管理系统。它是在Windows下,以SQL Server为数据库开发平台,服装商城管理系统的功能已基本实现,主要包括用户、服装信息、通知公告、留言板、订单信息等。 论文主要从系统的分…

飞腾FT-2000/4处理器+复旦微FPGA+国产操作系统解决方案(2)

XM-1104飞腾核心处理主板 ▶体积小、功耗低、高性能。 ▶功能接口多样化,采用高密度连接器,抗震效果好。 ▶成本低,扩展性强,根据用户的需求定制各种底板。 ▶产品灵活,便于维护,生命周期长。 指标 参数 …

SuperMap GIS地质体数据处理QA

作者:hyy 一、地质体数据简介 什么是三维地质建模?百度上给出的解析是:将地质、测井、地球物理资料和各种解释结果或者概念模型综合在一起生成的三维定量随机模型。 已建成的地质模型可以为我们提供很多信息。首先是地质的三维可视化。通过三维可视化&…

量子计算机:一场改变世界的开发竞赛

这样的设备可能会帮助解决气候变化和粮食短缺问题,也可能破坏互联网。在这场竞赛中,美国和中国谁会先到达目标? 神秘的机器 在加利福尼亚州圣巴巴拉的郊区,在果园和大海之间,坐落着一个不起眼的仓库,它的窗…

【区块链 | EVM】深入理解学习EVM - 深入Solidity数据存储位置

目录 目录 简介 EVM是一个工业工厂 为什么要在 Solidity 中理解 Evm 数据位置? 数据位置 → 概述 存储 内存 Calldata 堆栈(Stack) 代码 数据位置 - 规则 变量的默认位置 参考类型 在函数参数上的规则 在函数体内的规则 内存…

使用 QuTrunk+Amazon ParallelCluster3 进行并行计算

1.丘秉宜;2.邵伟;3.黄文;4.郭梦杰;5.刘利;6.刘波 1.亚马逊云科技 Hero;2.启科开发者生态负责人;3.启科 DEVOPS 工程师;4.启科量子资深研发工程师;5和;6.C高级…

Linux运维之knockd部署

如果你有一台公众可访问的服务器,黑客可以轻松扫描其IP地址,查找服务器上的开放端口(尤其是用于SSH的端口22)。将服务器隐藏起来、不让黑客看见的一种方法是使用knockd。knockd是一种端口试探服务器工具。它侦听以太网或其他可用接口上的所有流量&#x…

以代码绘制圣诞,过快乐圣诞节!

2022年圣诞节 12月25日 星期日 圣诞节的由来 基督教纪念耶稣诞生的重要节日。亦称耶稣圣诞节、主降生节,天主教亦称耶稣圣诞瞻礼。耶稣诞生的日期,《圣经》并无记载。公元336年罗马教会开始在12月25日过此节。12月25日原是罗马帝国规定的太阳神诞辰。有人…

百度百科怎么创建的?百度百科创建技巧分享

百度百科的创建并没有那么简单,虽然百度百科人人都可以编辑,我们在网上一搜就会出来很多相关的百科创建步骤,但是当你真的按照这些步骤去做的时候,就会出现很多问题,导致根本通不过。 百度百科怎么创建的?实…

ArcGIS基础实验操作100例--实验2平移矢量要素

实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 基础编辑篇--实验2 平移矢量要素 目录 一、实验背景 二、实验数据 三、实验步骤 (1)加载【Move】工具 (2)平移矢量要素 一、…

rocketmq搭建启动集成springboot落地并监控

目录 一、rocketmq服务器搭建启动: 二、springboot 集成rocketmq落地: 三、可视化页面集成: rocketmq是最近很流行的消息中间件,有很多的优点,比如多个topic也不会引起性能问题;今天我们开始搭建启动集成…

这5个素材库,新手也能让你做出精美的 PPT。

高质量免费PPT模板,各种PPT素材都有,文案模板直接套用,还有教程学习,对新手特别友好。1、菜鸟图库 https://www.sucai999.com/pptx.html?vNTYwNDUx网站有各种主题的PPT模板,工作总结、教育课件、述职汇报、节日庆典、…

美颜sdk中的人脸美型实现流程详解

在之前的文章中,小编讲了许多美颜sdk的功能实现流程,有一些是热门功能,例如美白、磨皮等,但是有一个功能小编遗漏没有讲到,虽然不常提起,但是它的热度并不低,这个功能就是——“人脸美型”。本篇…

一文解析Linux中断子系统softirq和tasklet

说明: Kernel版本:4.14ARM64处理器,Contex-A53,双核使用工具:Source Insight 3.5, Visio 1. 概述 中断子系统中有一个重要的设计机制,那就是Top-half和Bottom-half,将紧急的工作放…

电子招标采购系统—企业战略布局下的采购寻源

​ 智慧寻源 多策略、多场景寻源,多种看板让寻源过程全程可监控,根据不同采购场景,采取不同寻源策略, 实现采购寻源线上化管控;同时支持公域和私域寻源。 询价比价 全程线上询比价,信息公开透明&#xff0c…

嵌入式Linux内核开发必须了解的三十道题

Linux的同步机制从2.0到2.6以来不断发展完善。从最初的原子操作,到后来的信号量,从大内核锁到今天的自旋锁。这些同步机制的发展伴随Linux从单处理器到对称多处理器的过渡。 伴随着从非抢占内核到抢占内核的过度。Linux的锁机制越来越有效,也…

C# 基于文本的应用 正则表达式

一 基于文本的应用 1 控制台应用程序 2 Main()函数的参数-命令行参数 ① Main()函数可以带string[]参数; ② Main()函数可以有返回值(int),也可以为void; 二 使用Environment类 CommandLine CommandLineArgs MachineName OSVersion UserDomainName UserName …