NodeJs 第十一章 express

Express 是基于 Node.js 平台,快速、开放、极简的 web 开发框架

基本使用

安装

npm install express --save

示例代码

const express = require('express')
const app = express()
const port = 3000app.get('/', (req, res) => {res.send('Hello World!')
})app.listen(port, () => {console.log(`Example app listening on port ${port}`)
})

Express 官方推荐脚手架

通过应用生成器工具 express-generator 可以快速创建一个应用的骨架。

你可以通过 npx (包含在 Node.js 8.2.0 及更高版本中)命令来运行 Express 应用程序生成器。

npx express-generator

命令行参数

 	-h, --help          输出使用方法--version       输出版本号-e, --ejs           添加对 ejs 模板引擎的支持--hbs           添加对 handlebars 模板引擎的支持--pug           添加对 pug 模板引擎的支持-H, --hogan         添加对 hogan.js 模板引擎的支持--no-view       创建不带视图引擎的项目-v, --view <engine> 添加对视图引擎(view) <engine> 的支持 (ejs|hbs|hjs|jade|pug|twig|vash) (默认是 jade 模板引擎)-c, --css <engine>  添加样式表引擎 <engine> 的支持 (less|stylus|compass|sass) (默认是普通的 css 文件)--git           添加 .gitignore-f, --force         强制在非空目录下创建

启动应用

  • 在 MacOS 或 Linux 中
DEBUG=myapp:* npm start
  • Windows 命令行中
set DEBUG=myapp:* & npm start
  • Windows 的 PowerShell 中
$env:DEBUG='myapp:*'; npm start

然后在浏览器中打开 http://localhost:3000/ 网址就可以看到这个应用了。

如何利用 Express 托管静态文件

express.static 内置中间件函数可以为我们提供 图像、CSS 文件和 JavaScript 文件之类的静态文件托管

express.static(root, [options])

多个静态资源目录,请多次调用 express.static 中间件函数:

app.use(express.static('public'))
app.use(express.static('files'))

路由

路由指的是确定应用程序如何响应对特定端点的客户机请求,这是一个URI(或路径)和一个特定的HTTP请求方法(GET、POST等)。

每个路由都可以有一个或多个handler函数,这些函数在匹配路由时执行。

路由定义采用以下结构

app.METHOD(PATH, HANDLER)
  • app: express的一个实例。
  • METHOD:
    • HTTP请求方法,小写(支持所有的http请求方法,特殊请求方法 all , 用于在所有HTTP请求方法的路径上加载中间件函数)。
  • PATH:
    • 路由路径,可以是字符串、字符串模式或正则表达式。
    • 如果需要在路径字符串中使用美元字符( ) ,请将其转义后用 ( [ a n d ] ) 括起来。例如 , / d a t a / ),请将其转义后用([and])括起来。例如, /data/ ),请将其转义后用([and])括起来。例如,/data/book 请求的路径字符串将是 /data/([\$])book
  • HANDLER:
    • 匹配路由时执行的函数。
    • 可以提供多个行为类似中间件的回调函数来处理请求。唯一的例外是,这些回调可能会调用next(‘route’)来绕过剩余的路由回调。您可以使用这种机制在路由上施加前置条件,然后在没有理由继续当前路由时将控制权传递给后续路由。
app.get('/example/b', (req, res, next) => {console.log('the response will be sent by the next function ...')next()
}, (req, res) => {res.send('Hello from B!')
})

app.route

app.route() 为路由路径创建可链接的路由处理程序。由于路径是在单个位置指定的,因此创建模块化路由很有帮助,还可以减少冗余和错别字。

下面是一个用app.route()定义的链式路由处理程序的例子。

app.route('/book').get((req, res) => {res.send('Get a random book')}).post((req, res) => {res.send('Add a book')}).put((req, res) => {res.send('Update the book')})

express.Router

express.Route 可以将路由器创建为一个模块,在其中加载一个中间件函数,定义一些路由,并将路由器模块挂载到主应用的某个路径上

const express = require('express')
const router = express.Router()
const app = express()// middleware that is specific to this router
router.use((req, res, next) => {console.log('Time: ', Date.now())next()
})
// define the home page route
router.get('/', (req, res) => {res.send('Birds home page')
})
// define the about route
router.get('/about', (req, res) => {res.send('About birds')
})app.use('/pub', router)

中间件

中间件是可以访问请求对象( req)、响应对象( res) 以及next应用程序请求-响应周期中的函数。该next函数是 Express 路由器中的一个函数,当被调用时,它会执行当前中间件之后的中间件。

如果当前的中间件函数没有结束请求,则必须调用next()将控制权传递给下一个中间件函数。否则,请求将被挂起。

中间件加载的顺序很重要:首先加载的中间件函数也首先执行

在这里插入图片描述
如何使用中间件

  • 应用层
const express = require('express')
const app = express()app.use((req, res, next) => {console.log('Time:', Date.now())next()
})
  • 路由层
const express = require('express')
const app = express()
const router = express.Router()// a middleware function with no mount path. This code is executed for every request to the router
router.use((req, res, next) => {console.log('Time:', Date.now())next()
})
  • 错误处理中间件
app.use((err, req, res, next) => {console.error(err.stack)res.status(500).send('Something broke!')
})
  • 内置中间件

    • express.static提供静态资源,例如 HTML 文件、图像等。
    • express.json使用 JSON 有效负载解析传入请求。注意:适用于 Express 4.16.0+
    • express.urlencoded使用 URL 编码的有效负载解析传入请求。注意:适用于 Express 4.16.0+

如何覆盖 Express API

Express API 由请求和响应对象的各种方法和属性组成。这些都是通过原型继承的。Express API 有两个扩展点:

  1. 全局原型位于 express.requestexpress.response
  2. 特定原型位于 app.requestapp.response

覆盖方法

app.response.sendStatus = function (statusCode, type, message) {// code is intentionally kept simple for demonstration purposereturn this.contentType(type).status(statusCode).send(message)
}

覆盖属性

Object.defineProperty(app.request, 'ip', {configurable: true,enumerable: true,get () { return this.get('Client-IP') }
})

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

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

相关文章

NSR原理描述

相关概念 HA&#xff08;High Availability&#xff09;&#xff1a;高可靠性/高实用性的简称&#xff0c;这里指主备板间的备份通道。NSF&#xff08;Non-Stop Forwarding&#xff09;&#xff1a;不间断转发。NSR&#xff08;Non-Stop Routing&#xff09;&#xff1a;不间断…

24年春招要来了,大学生第一次实习去大厂重要么?

春招要来了&#xff0c;大学生第一次实习去大厂重要么? 1.错峰实习。2.继任直招。3.优化简历&#xff0c;匹配优先。4. 善用新技术 先说一个暴论: 实习一定要去大厂&#xff0c;尤其是非头部院校的同学&#xff0c;你就算进去打螺丝&#xff0c;也要进大厂 关于我&#xff1a…

无需任何三方库,在 Next.js 项目在线预览 PDF 文件

前言&#xff1a; 之前在使用Vue和其它框架的时候&#xff0c;预览 PDF 都是使用的 PDFObject 这个库&#xff0c;步骤是&#xff1a;下载依赖&#xff0c;然后手动封装一个 PDF 预览组件&#xff0c;这个组件接收本地或在线的pdf地址&#xff0c;然后在页面中使用组件的车时候…

【python】08.面向对象编程基础

面向对象编程基础 活在当下的程序员应该都听过"面向对象编程"一词&#xff0c;也经常有人问能不能用一句话解释下什么是"面向对象编程"&#xff0c;我们先来看看比较正式的说法。 "把一组数据结构和处理它们的方法组成对象&#xff08;object&#…

Redis入门-redis的五大数据类型+三种特殊的数据类型

前言&#xff1a;Redis有五大基本类型与三种特殊类型的介绍 Redis有五大基本类型&#xff1a;字符串&#xff08;string&#xff09;、哈希&#xff08;hash&#xff09;、列表&#xff08;list&#xff09;、集合&#xff08;set&#xff09;和有序集合&#xff08;sorted se…

大模型实战营Day4 XTuner大模型单卡低成本微调实战

FINETUNE简介 LLM下游应用中&#xff0c;增量预训练和指令跟随是经常会用到的两种微调模式 指令跟随微调 使用场景&#xff1a;让模型学会对话模板&#xff0c;根据人类指令进行对话 训练数据&#xff1a;高质量的对话&#xff0c;问答数据 为什么需要指令微调&#xff1f; 因为…

前端重置密码报错记录

昨天晚上&#xff0c;我写了重置密码的前端&#xff0c;测试的时候报错 今天上午&#xff0c;我继续试图解决这个问题&#xff0c;我仔细检查了一遍&#xff0c;前端没有问题 可以正常接收输入的数据并且提交 但是后端接收到的数据为空&#xff0c;后端接口也没有问题 但后端收…

大模型核心技术原理: Transformer架构详解

在大模型发展历程中&#xff0c;有两个比较重要点&#xff1a;第一&#xff0c;Transformer 架构。它是模型的底座&#xff0c;但 Transformer 不等于大模型&#xff0c;但大模型的架构可以基于 Transformer&#xff1b;第二&#xff0c;GPT。严格意义上讲&#xff0c;GPT 可能…

vscode无法自动补全

前提&#xff1a;安装c/c插件 c/c插件功能非常强大&#xff0c;几乎能满足日常编码过程中常用的功能&#xff1b;因为也包含自动补全的功能&#xff0c;开启方法如下&#xff1a; 文件->首选项->设置&#xff1a; 扩展->c/c->Intellisense&#xff0c;找到Intell…

C++多线程学习[三]:成员函数作为线程入口

一、成员函数作为线程入口 #include<iostream> #include<thread> #include<string>using namespace std;class Mythread { public:string str;void Test(){cout << str << endl;} }; int main() {Mythread test;test.str "Test";thr…

大数据-hive函数与mysql函数的辨析及练习-将多行聚合成一行

目录 1. &#x1f959;collect_list: 聚合-不去重 2. &#x1f959;collect_set(col): 聚合-去重 3. &#x1f959;mysql的聚合函数-group_concat 4. leetcode练习题 1. &#x1f959;collect_list: 聚合-不去重 将组内的元素收集成数组 不会去重 2. &#x1f959;collec…

mac 上 ssh: connect to host localhost port 22: Connection refused

1。 问题 在搭建hadoop环境的时候 发现ssh localhost 在报错 2. 解决 打开系统设置 -> 共享 -> -> 在左边服务中选择 远程登录 注意红框这些选项慎重选择&#xff01;&#xff01;&#xff01; 修改后&#xff0c;在终端再次 ssh localhost 发现登录成功了 如果…

科大讯飞星火大模型接入API js 部分 接口 安装注意事项

下载以下链接例子运行程序 https://xfyun-doc.xfyun.cn/static%2F16968175055332330%2Fspark_js_demo.zip 官网给的说明 准备 1.在demo中填写APPID、APISecret、APIKey&#xff0c;可到控制台-我的应用-大模型页面获取 2.安装nodejs 本地运行 1.打开cmd&#xff0c;进入dem…

QT上位机开发(权限管理)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 如果只是简单的工具软件&#xff0c;其实是没有权限管理这么一说的。比如说&#xff0c;串口工具、485工具之类的软件&#xff0c;其实根本不存在所…

MOOSE相关滤波跟踪算法(个人学习笔记)

MOOSE 论文标题 “Visual Object Tracking using Adaptive Correlation Filters” 原文地址 用滤波器对目标外观进行建模&#xff0c;并通过卷积操作来执行跟踪。 参考阅读&#xff1a; 目标跟踪经典算法——MOSSE&#xff08;Minimum Output Sum Square Error&#xff09…

聊天机器人之接入智能回复(四)

智能回复实现思路 目前市场上有许多大语言模型&#xff0c;他能帮助我们更好的解决问题或者陪伴我们聊天。最先兴起的就是OpenAI的ChatGPT&#xff0c;但是我们国内使用不太方便。所以这里我使用咱们国内的平台做一个简单展示。 首先这里咱们使用的是讯飞星火认知大模型&…

Bean作用域及生命周期

关于Bean对象&#xff0c;在将其存储到spring中以后&#xff0c;在使用或读取该Bean对象时&#xff0c;如果该对象是公有的&#xff0c;难免就会出现被一方修改&#xff0c;从而影响另外一方读取到的对象准确性的情况。因此了解Bean的作用域和生命周期就是十分必要的了。 首先…

Fedora Linux 中安装 nginx

Fedora 35 中安装 nginx 的方法非常简单。 运行下面的命令&#xff1a; sudo dnf install nginx 在提示你需要确认的地方&#xff0c;输入 y 后回车即可。 开机自动启动 如果你希望在你的操作系统重启的时候自动启动 nginx&#xff0c;请输入下面的命令&#xff1a; syst…

【昕宝爸爸小模块】如何让Java的线程池顺序执行任务

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你&#x1f44d;点赞、&#x1f5c2;️收藏、加❤️关注哦。 本文章CSDN首发&#xff0c;欢迎转载&#xff0c;要注明出处哦&#xff01; 先感谢优秀的你能认真的看完本文&…

文本翻译GUI程序,实现简单的英汉互译

项目地址&#xff1a;mendianyu/txtTranslate: 文本翻译GUI程序&#xff0c;实现简单的英汉互译 (github.com) 文本翻译GUI程序&#xff0c;实现简单的英汉互译 项目结构 三个java文件加一个pom文件 项目运行效果 语言可选择en(英语) zh(汉语) auto(自动识别&#xff0c;仅源语…