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 骨架生成器
- 先安装包 express-generator, 会暴露一个命令 express
npm i -g express-generator - 使用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 中间件函数。
常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。
昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。