nodejs学习04——express框架

搭建环境

新建一个文件夹 LearnExpress,

命令行:
//初始化包
npm init

// 安装 express
npm i express

初体验

//1. 导入 express
const express = require('express');
//2. 创建应用对象
const app = express();
//3. 创建路由规则
app.get('/home', (req, res) => {
	//res.end('hello express server');//也可以用 send
	res.send('hello ...');
});
//4. 监听端口 启动服务
app.listen(8080, () =>{
	console.log('服务已经启动, 端口监听为 8080...');
});

路由的使用

//路由的使用
//一个路由的组成有 请求方法 , 路径 和 回调函数 组成

//1. 导入 express
const express = require('express');
//2. 创建应用对象
const app = express();

// 创建 get 路由
app.get('/home', (req, res) => {
	res.send('网站首页');
});

app.get('/',(req,res)=>{
	res.send('我才是真正的首页');
});

//创建 post 路由
app.post('/login', (req, res) => {
	res.send('登录成功');
});

//匹配所有的请求方法
app.all('/search', (req, res) => {
	res.send('1 秒钟为您找到相关结果约 100,000,000 个');
});

//自定义 404 路由
app.all("*", (req, res) => {
	res.send('<h1>404 Not Found</h1>')
});

//4. 监听端口 启动服务
app.listen(8080, () =>{
	console.log('服务已经启动, 端口监听为 8080...');
});

请求参数获取

//1. 导入 express
const express = require('express');
//2. 创建应用对象
const app = express();

//获取请求的路由规则
app.get('/request', (req, res) => {
	//1. 获取报文的方式与原生 HTTP 获取方式是兼容的
	console.log(req.method);//GET
	console.log(req.url);// /request?abc=100&pw=wod
	console.log(req.httpVersion);//1.1
	console.log(req.headers);
	//2. express 独有的获取报文的方式
	//获取查询字符串
	console.log(req.query); // 『相对重要』  { abc: '100', pw: 'wod' }
	// 获取指定的请求头
	console.log(req.get('host'));// 127.0.0.1:8080
	console.log(req.get('user-agent'));
	
	//res.write('test');
	//res.end('请求报文的获取');
	res.send('请求报文的获取');
});

//获取路由参数,路由参数指的是 URL 路径中的参数(数据)
app.get('/:id.html', (req, res) => {
	res.send('商品详情, 商品 id 为' + req.params.id);
});

//4. 监听端口 启动服务
app.listen(8080, () =>{
	console.log('服务已经启动, 端口监听为 8080...');
});

响应设置

//1. 导入 express
const express = require('express');
//2. 创建应用对象
const app = express();

//获取请求的路由规则
app.get("/response", (req, res) => {
	//1. express 中设置响应的方式兼容 HTTP 模块的方式
	// res.statusCode = 404;
	// res.statusMessage = 'xxx';
	// res.setHeader('abc','xyz');
	// res.write('响应体');
	// res.end('xxx');
	//2. express 的响应方法
	res.status(500); //设置响应状态码
	res.set('xxx','yyy');//设置响应头
	res.send('中文响应不乱码');//设置响应体
	//连贯操作
	// res.status(404).set('xxx','yyy').send('你好朋友');
	//3. 其他响应
	// res.redirect('http://atguigu.com');//重定向
	// res.download('./package.json');//下载响应
	// res.json();//响应 JSON
	// res.sendFile(__dirname + '/home.html'); //响应文件内容
});


//4. 监听端口 启动服务
app.listen(8080, () =>{
	console.log('服务已经启动, 端口监听为 8080...');
});

express 中间件

什么是中间件

中间件(Middleware)本质是一个回调函数
中间件函数 可以像路由回调一样访问 请求对象(request) , 响应对象(response)

中间件的作用

中间件的作用 就是 使用函数封装公共操作,简化代码

中间件的类型

全局中间件
路由中间件

全局中间件

定义全局中间件

每一个请求 到达服务端之后 都会执行全局中间件函数。
声明中间件函数

let recordMiddleware = function(request,response,next){
	//实现功能代码
	//.....
	//执行next函数(当如果希望执行完中间件函数之后,仍然继续执行路由中的回调函数,必须调用next)
	next();
}

应用中间件

app.use(recordMiddleware);

声明时可以直接将匿名函数传递给 use

app.use(function (request, response, next) {
	console.log('定义第一个中间件');
	next();
});

多个全局中间件

express 允许使用 app.use() 定义多个全局中间件

app.use(function (request, response, next) {
  console.log('定义第一个中间件');
  next();
});
app.use(function (request, response, next) {
  console.log('定义第二个中间件');
  next();
});

路由中间件

如果 只需要对某一些路由进行功能封装 ,则就需要路由中间件
调用格式如下:

app.get('/路径',中间件函数,(request,response)=>{
//...
});
app.get('/路径',中间件函数1,中间件函数2,(request,response)=>{
//...
});

例子-点击查看代码
//导入 express
const express = require('express');
//创建应用对象
const app = express();

let recordMiddleware = function(request,response,next){
	//实现功能代码
	console.log('进入中间件1');
	console.log(request.method);
	console.log(request.path);
	console.log(request.hostname);
	//.....
	//执行next函数(当如果希望执行完中间件函数之后,仍然继续执行路由中的回调函数,必须调用next)
	next();
}

// 全局中间件
app.use(recordMiddleware);

app.use(function(req,res,next){
	console.log('进入中间件2');
	next();
});

app.use((request,response,next) => {
	console.log('进入中间件3');
	next();
});


app.get("/hello", (req, res) => {
	
	res.status(200); //设置响应状态码
	var person = {name:'Lee',age:18};
	res.json(person);//响应 JSON
	
});


let routeMid = (req,res,next)=>{
	console.log('进入路由中间件1');
	next();
};
let routeMid2 = (req,res,next)=>{
	console.log('进入路由中间件2');
	next();
};

//路由中间件
app.get("/hello1", routeMid, routeMid2, (req, res) => {
	
	res.status(200); //设置响应状态码
	var person = {name:'Lee',age:18};
	res.json(person);//响应 JSON
	
});


//监听端口 启动服务
app.listen(8080, () => {
	console.log('服务已经启动, 端口监听为 8080...');
});

静态资源中间件

express 内置处理静态资源的中间件

例子-点击查看代码
//导入 express
const express = require('express');
//创建应用对象
const app = express();

//静态资源中间件的设置,将当前文件夹下的public目录作为网站的根目录
app.use(express.static('./public')); //当然这个目录中都是一些静态资源
//如果访问的内容经常变化,还是需要设置路由
//但是,在这里有一个问题,如果public目录下有index.html文件,单独也有index.html的路由,
//则谁书写在前,优先执行谁
app.get('/index.html',(request,response)=>{
	respsonse.send('首页');
});

//监听端口 启动服务
app.listen(8080, () => {
	console.log('服务已经启动, 端口监听为 8080...');
});

获取请求体数据 body-parser

express 可以使用 body-parser 包处理请求体

第一步:安装body-parser
npm i body-parser

第二步:导入 body-parser包

const bodyParser = require('body-parser');

第三步:获取中间件函数

//处理 querystring 格式的请求体
let urlParser = bodyParser.urlencoded({extended:false});
//处理 JSON 格式的请求体
let jsonParser = bodyParser.json();

第四步:设置路由中间件,然后使用 request.body 来获取请求体数据

app.post('/login', urlParser, (request,response)=>{
	//获取请求体数据
	console.log(request.body);
	//用户名
	console.log(request.body.username);
	//密码
	console.log(request.body.userpass);
	response.send('获取请求体数据');
});

获取到的请求体数据:
[Object: null prototype] { username: 'admin', userpass: '123456' }

例子-点击查看代码
//导入 express
const express = require('express');
const bodyParser = require('body-parser');

//创建应用对象
const app = express();

//处理 querystring 格式的请求体
let urlParser = bodyParser.urlencoded({extended:false});
//处理 JSON 格式的请求体
let jsonParser = bodyParser.json();

app.post('/login', urlParser, (request,response)=>{
	//获取请求体数据
	console.log(request.body);
	//用户名
	console.log(request.body.username);
	//密码
	console.log(request.body.pwd);
	response.send('获取请求体数据');
});

app.post('/login2', jsonParser, (request,response)=>{
	//获取请求体数据
	console.log(request.body);
	//用户名
	console.log(request.body.username);
	//密码
	console.log(request.body.pwd);
	response.send('获取请求体数据2');
});
/*
{ username: 'admin', pwd: '123456' }
admin
123456
*/

//监听端口 启动服务
app.listen(8080, () => {
	console.log('服务已经启动, 端口监听为 8080...');
});

Express 骨架生成器

  1. 先安装包 express-generator, 会暴露一个命令 express
    npm i -g express-generator
  2. 使用express命令
    命令行进入一个文件夹,执行
    express -e test_15_generator
    会生成一个文件夹test_15_generator,里面是express骨架
    // 查看帮助命令
    express -h

模块化路由 express.Router

使用 express.Router 类来创建可安装的模块化路由处理程序。Router 实例是完整的中间件和路由系统;因此,常常将其称为“微型应用程序”。

以下示例将路由器创建为模块,在其中装入中间件,定义一些路由,然后安装在主应用程序的路径中。

在应用程序目录中创建名为 birds.js 的路由器文件,其中包含以下内容:

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

// middleware that is specific to this router
router.use(function timeLog(req, res, next) {
  console.log('Time: ', Date.now());
  next();
});
// define the home page route
router.get('/', function(req, res) {
  res.send('Birds home page');
});
// define the about route
router.get('/about', function(req, res) {
  res.send('About birds');
});
// 可以带 next
router.get('/about2', function(req, res, next) {
  res.send('About2 birds');
});

module.exports = router;

接着,在应用程序中装入路由器模块:

var birds = require('./birds');
...
app.use('/birds', birds);

此应用程序现在可处理针对 /birds 和 /birds/about 的请求,调用特定于此路由的 timeLog 中间件函数。

参考:https://www.expressjs.com.cn/zh-cn/guide/routing.html

posted @ 2023-11-21 14:55  htj10  阅读(39)  评论(0编辑  收藏  举报
TOP