没有挂载路径的中间件,通过该路由的每个请求都会执行该中间件:
const express = require('express') // 创建express实例 const app=express(); const router = express.Router(); // 没有挂载路径的中间件,通过该路由的每个请求都会执行该中间件 router.use(function (req, res, next) { console.log('Time:', Date.now()) next() }) // 将路由挂载至应用 app.use('/', router) app.listen(3000,()=>{ console.log("server start") })
一个中间件栈,显示任何指向 /user/:id 的 HTTP 请求的信息:
const express = require('express') // 创建express实例 const app=express(); const router = express.Router(); // 一个中间件栈,显示任何指向 /user/:id 的 HTTP 请求的信息 router.use('/user/:id', function(req, res, next) { console.log('Request URL:', req.originalUrl) next() }, function (req, res, next) { console.log('Request Type:', req.method) next() }) // 将路由挂载至应用 app.use('/', router) app.listen(3000,()=>{ console.log("server start") })
路由级中间件也一样,如果需要在中间件栈中跳过剩余中间件,调用 next(‘route’) 方法将控制权交给下一个路由。
const express = require('express') // 创建express实例 const app=express(); const router = express.Router(); // 一个中间件栈,处理指向 /user/:id 的 GET 请求 router.get('/user/:id', function (req, res, next) { // 如果 user id 为 0, 跳到下一个路由 if (req.params.id == 0) next('route') // 负责将控制权交给栈中下一个中间件 else next() // }, function (req, res, next) { // 渲染常规页面 res.send('aaa') }) // 处理 /user/:id, 渲染一个特殊页面 router.get('/user/:id', function (req, res, next) { console.log(req.params.id) res.send('bbb') }) // 将路由挂载至应用 app.use('/', router) app.listen(3000,()=>{ console.log("server start") })
(3) 错误处理中间件
错误处理中间件有 4 个参数,定义错误处理中间件时必须使用这 4 个参数。即使不需要 next 对象,也必须在签名中声明它,否则中间件会被识别为一个常规中间件,不能处理错误。一般放在所有写的中间件的后面,当其他中间件有错误时会执行。
app.use(function(err, req, res, next) { console.error(err.stack) res.status(500).send('Something broke!') })
(4) 内置中间件
比如 express.static
这个 Express内置的中间件。它基于 serve-static,负责在 Express 应用中提托管静态资源。每个应用可有多个静态目录。参数 root 指提供静态资源的根目录,可选的 options 参数拥有如下属性:
下面的例子使用了 express.static 中间件:
let options = { dotfiles: 'ignore', etag: false, extensions: ['htm', 'html'], index: false, maxAge: '1d', redirect: false, setHeaders: function (res, path, stat) { res.set('x-timestamp', Date.now()) } } app.use("/public".express.static('public', options))
每个应用可有多个静态目录,如:
app.use("/public",express.static('public')) app.use("/uploads",express.static('uploads')) app.use("/files",express.static('files'))
(5) 第三方中间件
通过使用第三方中间件从而为 Express 应用增加更多功能。
安装所需功能的 node 模块,并在应用中加载,可以在应用级加载,也可以在路由级加载。
下面的例子安装并加载了一个解析 cookie 的中间件: cookie-parser
npm install cookie-parser
const express = require('express') const app = express() const cookieParser = require('cookie-parser') // 加载用于解析 cookie 的中间件 app.use(cookieParser())
4. 获取请求的参数
如果前端的请求传来了get请求参数,那怎么拿到呢?
我们可以通过res.query
来拿到请求传来的参数:
app.get("/",(req, res) => { console.log(req.query); res.send("aaa") })
当我前端传来参数时,如http://localhost:3000?username=haiexijun&password=123456 ,就能获取到。
如果是post请求的话,只要改成app.post()就好了,但要在里面配置一下相关中间件。当然,不仅仅是app.post()这种应用级中间件哈,router.get() 、router.post()等中间件也能这样获取。
const express = require('express') // 创建express实例 const app=express(); const router = express.Router(); //配置解析post参数,不用下载第三方中间件,有一个内置的可以使用 app.use(express.urlencoded({extended:false})); router.post("/",(req, res) => { console.log(req.body); res.send({message:"ok"}) }) app.listen(3000,()=>{ console.log("server start") })
5. 利用 Express 托管静态文件
通过 Express 内置的 express.static 可以方便地托管静态文件,例如图片、CSS、JavaScript 文件等。
将静态资源文件所在的目录作为参数传递给 express.static 中间件就可以提供静态资源文件的访问了。例如,假设在 static 目录放置了图片、CSS 和 JavaScript 文件,你就可以:
app.use("/static",express.static('static')) app.use("/image",express.static('image'))
现在,/image 和 /static 目录下面的文件就可以访问了。
访问localhost:3000/image/dog.gif:
6. 在 Express 中使用模板引擎
服务端渲染:
我们先安装ejs模板引擎:
npm install ejs
需要在应用中进行如下设置才能让 Express 渲染模板文件:
1.创建views文件夹 , 用于放模板文件的目录,比如: app.set(‘views’, ‘./views’)
2.配置view engine, 模板引擎,比如: app.set(‘view engine’, ‘ejs’)
3.views文件夹下面创建test.ejs模板文件,用res.render( )来渲染模板。
下面简单演示一下:
编写test.ejs模板:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>test</title> </head> <body> <h1>姓名:<%=name%></h1> <h1>年龄:<%=age%></h1> </body> </html>
然后编写index.js:
const express = require('express') // 创建express实例 const app=express(); app.set('views','./views') app.set('view engine','ejs') app.get("/test",(req, res) => { //渲染模板返回给前端,第一个参数传模板的名字,第二个参数传渲染的动态数据(这里模拟一下) res.render("test",{name:"害恶细君",age:20}) }) app.listen(3000,()=>{ console.log("server start") })
模板引擎的使用就体验到这里了,如果想体验更多模板的语法,请参考ejs的官方文档。
7. Express 应用程序生成器
通过应用生成器工具 express-generator 可以快速创建一个应用的骨架。
安装生成器:
npm install -g express-generator
安装好后,就可以使用express
命令来生成项目底座了。
express生成器默认使用jade模板引擎,jade对新手很不友好。如果我要创建一个基于ejs模板引擎的底座,可以在运行express命令时指定一些参数来创建。比如:
express myapp --view=ejs
然后会得到如下的项目结构:
├── app.js ├── bin │ └── www ├── package.json ├── public │ ├── images │ ├── javascripts │ └── stylesheets │ └── style.css ├── routes │ ├── index.js │ └── users.js └── views ├── error.ejs └── index.ejs
然后我们在改项目的根目录下运行 npm i
安装一下依赖。
npm i
然后我们运行命令启动项目:
npm start
然后在浏览器中打开 http://localhost:3000/ 网址就可以访问这个应用了。关于生成的底座内部的代码细节,我认为没有必要过多要介绍解释,以后结合一个具体的小项目来具体讲。
虽然本文并没有完全总结express里的所有api,但本文的内容却很基础和重要。至于express的更多用法,里面大多数api其实查看文档都能看明白的。