文档:https://www.expressjs.com.cn/

安装

  1. npm install express --save

简单使用

  1. const express = require('express')
  2. const app = express()
  3. const port = 3000
  4. // api 访问接口
  5. app.get('/', (req, res) => {
  6. res.send('Hello World!')
  7. })
  8. // 监听端口
  9. app.listen(port, () => {
  10. console.log(`Example app listening at http://localhost:${port}`)
  11. })

listen

listten函数内部封装有http模块与https模块,可以看下图
image.png

路由

路由方法

  1. // GET method route
  2. app.get('/', function (req, res) {
  3. res.send('GET request to the homepage')
  4. })
  5. // POST method route
  6. app.post('/', function (req, res) {
  7. res.send('POST request to the homepage')
  8. })
  9. // 匹配任何get请求
  10. app.get('*', function (req, res) {
  11. res.send('GET request to the homepage')
  12. })
  13. 等效于
  14. app.get( function (req, res) {
  15. res.send('GET request to the homepage')
  16. })
  17. // 匹配所有请求
  18. app.all(function (req, res) {
  19. res.send('GET request to the homepage')
  20. })

路由路径 也就是请求路径

  1. app.get('/about', function (req, res) {
  2. res.send('about')
  3. })
  4. //This route path will match requests to /random.text.
  5. app.get('/random.text', function (req, res) {
  6. res.send('random.text')
  7. })
  8. // 动态路由
  9. app.get('/list/:id', function (req, res) {
  10. res.send('list')
  11. })

Route handlers

可以使用或多个路由处理函数,可以使用数组或者函数,这两者可以结合使用

单个回调函数

  1. app.get('/example/a', function (req, res) {
  2. res.send('Hello from A!')
  3. })

回调函数数组处理路由

  1. var cb0 = function (req, res, next) {
  2. console.log('CB0')
  3. next()
  4. }
  5. var cb1 = function (req, res, next) {
  6. console.log('CB1')
  7. next()
  8. }
  9. var cb2 = function (req, res) {
  10. res.send('Hello from C!')
  11. }
  12. app.get('/example/c', [cb0, cb1, cb2])

两者结合使用

  1. var cb0 = function (req, res, next) {
  2. console.log('CB0')
  3. next()
  4. }
  5. var cb1 = function (req, res, next) {
  6. console.log('CB1')
  7. next()
  8. }
  9. app.get('/example/d', [cb0, cb1], function (req, res, next) {
  10. console.log('the response will be sent by the next function ...')
  11. next()
  12. }, function (req, res) {
  13. res.send('Hello from D!')
  14. })

回调函数中的参数

Request

http://expressjs.com/en/5x/api.html#req

  1. // respond with "hello world" when a GET request is made to the homepage
  2. app.get('/a/:id', function (req, res, next) {
  3. console.log('请求头', req.headers)
  4. console.log('请求路径', req.path)
  5. console.log('请求参数', req.query)
  6. console.log('params', req.params) // 获取动态路由的参数
  7. res.send('Hello from D!') // 发送响应结果
  8. })

Response

http://expressjs.com/en/5x/api.html#res
image.png

  1. // respond with "hello world" when a GET request is made to the homepage
  2. app.get('/a/:id', function (req, res, next) {
  3. res.status('202')
  4. res.setHeader('a', 'aaa');
  5. res.send({
  6. id: 11,
  7. name: 'cnm',
  8. age: 18
  9. });
  10. // 重定向 将其重定向到其他网页
  11. // res.status(302).location('https://duyi.ke.qq.com').end();
  12. // res.redirect(302, 'https://www.baidu.com') // 直接重定向
  13. })

重定向 302 与 301

image.png

next

当前回调函数没有结束请求,调用next函数进入下一个回调函数

REST风格API接口

/api/student post 添加学生
/api/student get 获取学生
/api/student put 修改学生
/api/student delete 删除学生
用不同请求方法标明不同的操作类型,接口都一样