express 学习记录
来源:互联网 发布:2g 3g 4g网络区别 编辑:程序博客网 时间:2024/05/01 05:43
Expres 学习记录 - 1 - 概念
说明
Express 是一个精简的、灵活的 Node.js Web 程序框架,为构建单页、多页及混合的 Web 程序提供了一系列健壮的功能特性,可以快速的搭建一个完整功能的网站。
参考
- Node与Express开发
- Express 官网
- JavaScript 标准参考教程 node.js
- Express 4.x API
安装
mkdir express-demo cd express-demo npm init sudo npm install --save express
简单例子
const express = require('express'); const app = express(); // 设置端口号变量 app.set('port', process.env.PORT || 8854); // 设置路由 app.get('/about/1', function (req, res) { res.type('text/plain'); res.send('about page 1'); }) app.get('/about/2', function (req, res) { res.type('text/plain'); res.send('about page 2'); }) app.get('/about/*', function (req, res) { res.type('text/plain'); res.send('about page'); }) app.use(function (req, res) { res.type('text/plain'); res.status(400); res.send('400 - Not Found'); }) // 监听端口请求 app.listen(app.get('port'), function () { console.log( 'Express started on http://localhost:' + app.get('port') + '; press Ctrl-C to terminate.' ); })
注意: req 请求,res 响应 与 Node 提供的对象一致,可以使用 req.pipe() req.on(‘data’, function() {}) 以及任何 Node 提供的方法
1. 中间件
中间件就是处理 HTTP请求的函数,最大的特点就是一个中间件处理完,再传递给下一个中间件,一个 Express 应用就是在调用各种中间件,每个中间件可以从 App 实例接受三个参数:
- request 对象,代表 HTTP 请求
- response 对象,代表 HTTP 的回应
- next 回调函数,代表下一个中间件,不穿参数表示调用下一个中间件,传递参数表示抛出错误,后边的中间件将不在执行
每个中间件都可以对 HTTP 请求进行加工,并且决定是否调用 next 方法,将请求传给下一个中间件
1. use 方法 注册中间件
app.use([path], function[,function ...])
挂载中间件方法到路径上,如果路径未指定,那么默认为 ‘/’,中间件方法是顺序处理的,所以中间件包含的顺序是很重要的
app.use('/', function (req, res, next) { console.log(req.method + ' from ' + req.url); next(); }) app.use('/about', function (req, res, next) { console.log('in /about'); req.url === '/1' ? next() : res.send('sssss'); }) app.use('/about', function (req, res) { res.send('ppp'); console.log('only /about/1 can print'); }) app.use(function (req, res) { res.status(404); res.send('404 Error'); })
注意:
use(path)
方法中的路径,例如/aaa
将会匹配/aaa
、/aaa/1
等
2. 应用级中间件
应用级中间件绑定到 app 对象,使用
app.use()
和app.METHOD()
METHOD 即为需要处理的 HTTP 请求方法
const app = express(); // 没有挂载路径的中间件,应用的每个请求都会执行该中间件 app.use(function (req, res, next) { console.log('Time:', Date.now()); next(); }); // 挂载至 /user/:id 的中间件,任何指向 /user/:id 的请求都会执行它 app.use('/user/:id', function (req, res, next) { console.log('Request Type:', req.method); next(); }); // 路由和句柄函数(中间件系统),处理指向 /user/:id 的 GET 请求 app.get('/user/:id', function (req, res, next) { res.send('USER'); });
3. 路由级中间件
路由级中间件和应用级中间件一样,只是它绑定的对象为 express.Router()。
const app = express(); const router = express.Router(); router.get('/', function (req, res) { res.send('admin home page'); }) router.get('/about', function (req, res) { res.send('admin about page'); }) // 挂载到 '/admin' 可以访问 '/admin' 和 '/admin/about' app.use('/admin', router);
4. 错误处理中间件
错误处理中间件有四个参数,定义时,必须使用,即使不需要使用也一定要声明,否则会将其识别为一个常规的中间件,不能处理错误
app.use(function (err, req, res, next) { console.log('something error'); next(err); }) // 可以定义多个错误处理程序 app.use(function (err, req, res, next) { console.error(err.stack); res.status(500).send('Something broke!'); next(err); })
5. 内置中间件
express.static(root, [options])
是目前 Express 唯一内置中间件,负责托管静态资源,参数 root 指提供静态资源的根目录
// 可以通过 http://localhost:8854/test.txt 访问 public 目录下的文件 app.use(express.static('public')); // 可以多次调用 app.use(express.static('public')); app.use(express.static('files')); // 设置虚拟目录 通过 http://localhost:8854/static/test.txt 访问文件 app.use('/static', express.static('public'));
6. 第三方中间件
通过使用第三方中间件从而为 Express 应用增加更多功能。安装所需功能的 node 模块,并在应用中加载,可以在应用级加载,也可以在路由级加载。
// npm install --save cookie-parser const express = require('express'); const cookieParser = require('cookie-parser'); const app = express(); // 加载用于解析 cookie 的中间件 app.use(cookieParser());
2. 路由
路由是指如何定义应用的端点(URIs)以及如何响应客户端的请求。通过
app.use()
方法,在中间件方法中可以定义基础路由,express
还提供了一些其他的接口实现路由
1. all 方法 HTTP 动词方法
Express 提供了 use 方法的一些别名,针对不同的请求
all
方法,表示所有指定路径的请求必须通过该中间件get
方法,表示只有指定路径的 get 请求通过该中间件post、put、delete
方法,与 get 方法一致,用于筛选特定的请求方式
app.all('/a', function (req, res, next) { res.writeHead(200, 'all'); next() }) app.get('/a', function (req, res) { res.end('get /a'); }) app.post('/a', function (req, res) { res.end('post /a'); })
注意: path 部分是绝对匹配的,例:
app.get('/a')
不会匹配/a/b
这样的路径;path 部分可以使用模式匹配或者正则表达式,配置动态路由
2. route 方法创建链式路由
可以使用
app.route()
创建路由路径的链式路由句柄,之后可以在其上施加各种 HTTP 动作的中间件,这样路径在一个地方指定,有助于创建模块化的路由,
app.route('/a/*') .all(function (req, res, next) { console.log(req.url); next(); }) .get(function (req, res, next) { console.log('get'); res.send('get something'); }) .post(function (req, res, next) { console.log('post'); res.send('post something'); });
3. 路由句柄
以上的请求处理(路由句柄)都是一个类似中间件的回调函数,实际上路由句柄可以有多种形式,可以是一个函数、多个函数、函数数组,或者是混合
// 单个回调函数 app.get('/a', function (req, res) { res.end('get /a'); }) // 多个回调函数 第一个回调函数执行 next() 后第二个回调函数才会执行 app.get('/a/:id', function (req, res, next) { res.write('first callback'); req.params.id === 'b' ? next('route') : next(); }, function (req, res) { res.end('\ncurrent route'); }) // 如果第一个回调函数 执行的 next() 方法传入 'route' 参数,则会跳出当前路由,执行下一个路由 app.get('/a/:id', function (req, res) { console.log('next route'); res.end('\nnext route'); }) // 回调函数数组 回调函数依次执行,知道没有 next() 调用 const cb0 = function (req, res, next) { console.log('CB0'); next(); } const cb1 = function (req, res, next) { console.log('CB1'); next(); } const cb2 = function (req, res) { res.send('Hello from C!'); } app.get('/a/*', [cb0, cb1, cb2]);
4. Express.Router 创建模块化、可挂载的路由句柄
通过
Express.Router()
可以创建一个‘迷你程序’,调用后返回一个路由器实例,具有操作中间件以及路由方法的能力,为不同的访问路径,指定回调函数;最后挂在到某个路径。
const app = express(); const router = express.Router(); router.get('/', function (req, res) { res.send('admin home page'); }) router.get('/about', function (req, res) { res.send('admin about page'); }) // 挂载到 '/admin' 可以访问 '/admin' 和 '/admin/about' app.use('/admin', router);
router 实例也可以使用 route 方法创建链式路由
router.route('/about') .get(function (req, res) { res.send('admin about page get'); }) .post(function (req, res) { res.send('admin about page post'); })
router 实例也可以使用
use()
方法指定中间件,即在数据正式发送前进行处理,中间件会顺序执行,而且必须放在 HTTP 动词方法之前,否则不会执行
router.use(function (req, res, next) { console.log(req.url); next(); }) router.get('/', function (req, res) { res.send('admin home page'); })
相关文章
- express 学习记录 - 1 - 概念
- express 学习记录 - 2 - api
- Express学习记录
- express学习笔记记录
- express 学习记录
- express 学习记录
- express 学习
- IIS Express 使用记录
- express framework 学习笔记
- express学习笔记
- Express框架学习
- Express初步学习
- Express框架学习总结
- Express学习笔记
- express学习手记
- express框架学习
- 学习使用express
- Express学习笔记
- Developer Express部分控件用法记录
- express如何记录日志并写入文件
- EM算法的目的
- js中push(),pop(),unshift(),shift()的用法小结
- IntelliJ idea鼠标移动到类上显示文档document(javadoc)内容
- 输入框基本的正则限制
- Instruments 调试工具的使用
- express 学习记录
- WinForm状态栏实时显示当前时间
- html中内容垂直水平居中
- 方便好用的 Beautifulsoup
- C 标准库
- 用Android studio 生成jar包--->亲测可用
- 给出一个2D板和字典中的单词列表,找到棋盘上的所有单词。每个单词必须由顺序相邻单元格的字母构成。不能重复使用
- tp5批量删除
- ReactNative错误捕捉与处理