Express 框架
Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。
使用 Express 可以快速地搭建一个完整功能的网站。
Express 框架核心特性:
可以设置中间件来响应 HTTP 请求。
定义了路由表用于执行不同的 HTTP 请求动作。
可以通过向模板传递参数来动态渲染 HTML 页面。
安装
在安装了Node.js
前提下,在应用中通过npm init
命令创建一个package.json
文件,在该目录下安装Express
并将其保存到以来列表中。
npm install express --save
Express 应用程序生成器
通过应用生成器工具express-generator
快速创建一个应用的骨架,其包含了express
命令行工具。
npm install express-generator -g
通过生成器创建的应用一半都有如下目录结构:
.
├── app.js
├── bin
│ └── www
├── package.json
├── public
│ ├── images
│ ├── javascripts
│ └── stylesheets
│ └── style.css
├── routes
│ ├── index.js
│ └── users.js
└── views
├── error.pug
├── index.pug
└── layout.pug
7 directories, 9 files
路由
指确定应用程序如何响应对特定端点的客户端请求(url和特定http请求方法)。
每个路由可以有一或多个在路由匹配时执行的处理函数HANDLER。
express.METHOD(PATH,HANDLER)
例如
app.get()
app.post()
app.all() //可处理所有HTTP方法
app.use()
//将特定的中间件指定为回调函数 其中的回调函数可以是router对象
详细METHOD请查看app.METHOD
路由路径(Route paths)
-
字符串类型
app.get('/',function(req,res){ }) //根路径 app.get('/something',function(req,res){ })
-
字符串模式
app.get('/ab?cd',function(req,res){ //会匹配abc/abd }) app.get('/ab*cd',function(req,res){ //会匹配abcdcd })
-
正则表达式模式
app.get('/a/',function(req,res){ //匹配任何有"a"的字符串 })
路由参数(Route parameters)
用于捕获URL中的值,这些值存在一个req.params
的对象中,各值在路由中的名字指定为各自的键名。
其中路由参数可设置为正则表达式,-
和.
Route path: /flights/:from-:to
Request URL: http://localhost:3000/flights/LAX-SFO
req.params: { "from": "LAX", "to": "SFO" }
//
Route path: /user/:userId(\d+)
Request URL: http://localhost:3000/user/42
req.params: {"userId": "42"}
路由回调函数(Route handlers)
回调函数含有三个参数:req
、res
、next
注意:回调函数可能会使用next('route')
绕过该路由下其他的回调函数跳到下个路由。
当有多个回调函数时,有以下的几种表示方法。
app.get('/',function(req,res,next){
next()
},function(req,res){
res.send('B')
})
//
let a=function(req,res,next){
next()
}
let b=function(req,res,next){
next()
}
app.get('/',[a,b],function(req,res,next){
next()
})
请求
方法名 | 作用 |
---|---|
req.app |
当callback为外部文件时,用req.app访问express的实例 |
req.baseUrl |
获取路由当前安装的URL路径 |
req.body |
请求主体 |
req.params |
获取路由参数 |
req.path |
获取请求路径 |
req.protocol |
获取协议类型 |
req.query |
获取url的查询参数串 |
req.get() |
获取指定的HTTP请求头 |
响应
方法名 | 作用 |
---|---|
res.download() |
提示下载一个文件 |
res.end() |
终止响应进程 |
res.json() |
发送json类型响应 |
res.jsonp() |
发送一个支持JSONP的JSON响应 |
res.redirect() |
重定向一个请求 |
res.render() |
渲染视图模板 |
res.send() |
发送各种各样类型的响应 |
res.sendFile() |
发送一个八位字节流的文件 |
res.sendStatus() |
设置状态码,在响应体中包含状态码的字符串表示 |
express.Router
Router实例是一个完整的中间件和路由系统。
文件名为birds.js
var express = require('express')
var router=express.Rounter()
// define home page route
router.get('/',function(req,res){
res.send('something')
})
module.exports=router
将该router模块加载:
var birds=require('./birds')
//...
app.use('/birds',birds);
中间件
中间件是对用户请求进行过滤和预处理的东西,它一般不会直接对客户端进行响应,而是将处理之后的结果传递下去。
中间件函数能够访问请求对象、相应对象和应用程序的请求/响应循环中的下一个中间件函数。
中间件函数能够执行以下的任务:
执行任何代码
改变请求和响应对象
停止请求-响应循环
调用堆栈中的下一个中间件函数。
如果当前中间件函数没有结束/响应循环,必须调用next()
。
整个中间件执行过程是一个洋葱模型。
编写中间件
var express=require('express')
var app=express();
var requestTime=function(req,res,next){
req.requestTime=Date.now()
next()
})//中间件
app.use(requestTime);//使用
使用中间件
应用层中间件
路由层中间件
错误处理中间件
内置中间件
第三方中间件
应用层中间件
使用app.use()
和app.METHOD
函数将应用层中间件绑定到应用程序对象的实例。
app.use('/user/:id',function(req,res,next){
next();
})
路由层中间件
绑定到express.Router()
的实例
var app=express();
var router=express.Router();
router.use(function(req,res,next){
next();
})//所有请求都会执行该路由
app.use('/',router);
错误处理中间件
始终采用四个自变量。必须提供四个自变量,以将函数标识为错误处理中间件函数。注意:即使无需使用next
,也必须指定该对象以保持特征符的有效性。
app.use(function(err,req,res,next){
console.log(err.stack);
res.status(500).send('Somthing broke!')
})
内置中间件
express.static(root,[options])
是Express中唯一内置的中间件函数,负责提供Express应用程序的静态资源。
root自变量指定从其中提供静态资源的根目录
let options ={
index:false;
redirect:false;
setHeaders:function(res,path,stat){
res.set('x-timestamp',Date.now())
}
}//options对象的属性
app.use(express.static('public'),options));
//可以有多个静态目录
第三方中间件
使用第三方中间件向 Express 应用程序添加功能。安装其具有所需功能的node.js模块,然后再加入。
详情查阅:Third-party middleward