Express 是一个基于 Node.js 平台的快速、开放、极简的Web开发框架。它本身仅仅提供了 web 开发的基础功能,但是通过中间件的方式集成了外部插件来处理HTTP请求,例如 body-parser 用于解析 HTTP 请求体,compression 用于压缩 HTTP 响应,cookie-parse 用于解析 cookie 数据,cors 用于处理跨域资源请求,Morgan 用于 http 请求日志。这使得 Express 本身变得更加灵活和简单。
Express 官方网站:https://expressjs.com/
下载安装 Express 框架模块包
npm install express
const express = require('express')
const app = express()
app.get('/', function (req, res) {
res.send('Hello World')
})
app.listen({port: 3000, hostname: '127.0.0.1'}, () => {
console.log('http://127.0.0.1:3000/')
})
app.get('/index', function (req, res) {
console.log(req.method)
console.log(req.url)
console.log(req.httpVersion)
console.log(req.headers)
console.log(req.path)
console.log(req.query)
console.log(req.ip)
console.log(req.params)
})
Node.Js 原生响应 response
app.get("/response", (req, res) => {
res.statusCode = 200;
res.statusMessage = 'love'
res.setHeader('xxx', 'yyy')
res.write('hello express')
res.end('response')
})
Express 响应 response
app.get("/response", (req, res) => {
res.status(200);
res.set('aaa', 'bbb')
res.send('hello Express')
})
app.get("/data/:id", (req, res) => {
console.log(req.params.id)
})
app.get("/redirect", (req, res) => {
res.redirect("http://www.baidu.com/")
})
app.get("/download", (req, res) => {
res.download(__dirname + "/test.mp4")
})
app.get("/json", (req, res) => {
res.json({name: 'helloworld', password: "helloworld"})
})
测试结果
在 Express 中, 使用 app.use 或者 app.METHOD 注册的中间件叫做应用级中间件。
全局中间件:给每个路由规则都添加中间件处理函数
app.use(function (req, res, next) {
console.log('我是一个全局中间件, 影响所有的路由规则')
})
局部中间件:给某一个特定的路由规则添加中间件处理函数
app.use('/users', function (req, res, next) {
console.log(`这里是一个局部中间件, 只影响/users路由`)
next()
})
express.Router()对象也可以注册中间件。使用 router.use 或者 router.METHOD 注册的中间件叫做路由级中间件。
var app = express()
var router = express.Router()
router.use(function (req, res, next) {
console.log('Time:', Date.now())
next()
})
router.get('/users/', function(req, res) {
res.send('hello')
})
如果要在网页中加载静态文件(比如样式表、图片等)就需要另外指定一个存放静态文件的目录。注意 index.html 文件是默认打开的资源。如果静态资源与路由规则同时匹配,谁先匹配谁就响应。路由响应动态资源,静态资源中间件响应静态资源。
app.use(express.static(__dirname + '/public'))
解析 querystring 请求体数据
const bodyparser = require('body-parser')
app.use(bodyparser.urlencoded({ extended: true }))
app.post("/post", (req, res) => {
console.log(req.body)
})
解析 json 请求体数据
const bodyparser = require('body-parser')
app.use(bodyparser.json())
app.post("/post", (req, res) => {
console.log(req.body)
})
{ username: '123', password: '123' }
Express 4.0 路由器功能成了一个单独的组件Express.Router。它好像小型的 express 应用程序一样,有自己的use、get、param 和 route 方法。
首先,Express.Router 是一个构造函数,调用后返回一个路由器实例。然后,使用该实例的HTTP动词方法,为不同的访问路径,指定回调函数;最后,挂载到某个路径。
var router = express.Router();
router.get('/', function(req, res) {
res.send('首页');
});
router.get('/about', function(req, res) {
res.send('关于');
});
app.use('/', router);
定义了两个访问路径,然后将它们挂载到根目录。如果最后一行改为app.use(‘/app’, router),则相当于为/app和/app/about这两个路径,指定了回调函数。这种路由器可以自由挂载的做法,为程序带来了更大的灵活性,既可以定义多个路由器实例,也可以为将同一个路由器实例挂载到多个路径。
假定 app 是 Express 的实例对象,Express 4.0为该对象提供了一个route属性。app.route 实际上是 express.Router() 的缩写形式,除了直接挂载到根路径。因此对同一个路径指定 get 和 post 方法的回调函数,能写成链式形式。
app.route('/login')
.get(function(req, res) {
res.send('this is the login form');
})
.post(function(req, res) {
console.log('processing');
res.send('processing the login form!');
});