路由

针对前端发送的请求不同,有以下几种常见的处理请求的方式:

app.get('/', function (req, res, next) { }); // 处理get请求
app.post('/', function (req, res, next) { }); // 处理post请求
app.put('/', function (req, res, next) { }); // 处理put请求
app.delete('/', function (req, res, next) { }); // 处理delete请求
app.use('/', function (req, res, next) { }); // 处理所有的请求
app.all('/', function (req, res, next) { }); // 处理所有的请求

注意

查询字符串不是路由路径的一部分。

举例

const express = require('express')
const app = express()
app.use('/', function (req, res, next) {
  console.log('Hello Express')
  next()
})
app.get('/', function (req, res) {
  res.sendFile( __dirname + "/" + "index.html" );
});
app.post('/', function (req, res) {
  res.send('Got a POST request');
});
app.put('/', function (req, res) {
  res.send('Got a PUT request');
});
app.delete('/', function (req, res) {
  res.send('Got a DELETE request');
});

正则匹配

除了普通的请求路径写法,还支持正则匹配的路由:

// 对页面 abcd, abxcd, ab123cd, 等响应 GET 请求
// 字符 ?、+、* 和 () 是正则表达式的子集,- 和 . 在基于字符串的路径中按照字面值解释。
app.get('/ab*cd', (req, res) => {
  console.log("/ab*cd GET 请求")
  res.send('正则匹配')
})

all

还有一种比较特殊的app.all(),当然之前提到的 app.use() 也可以,不管使用 GET、POST、PUT、DELETE 或其他任何 http 模块支持的 HTTP 请求,句柄都会得到执行。

app.all('/', function (req, res, next) {
  console.log('Accessing the secret section ...')
  next() // pass control to the next handler
})

链式路由

同一来源路径的路由可以使用链式的写法,使用 route 方法即可。

const express = require('express')
const app = express()
app.route('/book')
  .get(function(req, res) {
    res.send('Get a random book');
  })
  .post(function(req, res) {
    res.send('Add a book');
  })
  .put(function(req, res) {
    res.send('Update the book');
  });

get请求的处理

在路由回调中,使用 request.query 可以接收到查询字符串,以对其做处理,返回对应的数据。

const express = require('express')
const app = express()
let users = {
  'zhang': '123'
}
app.get('/', (req, res) => {
  res.send('Hello express')
})
app.get('/user', (req, res) => {
  console.log(req.query)
  let user = req.query['user']
  let pass = req.query['pass']
  if (users[user] === pass) {
    res.send({'ok': true, 'msg': '登录成功'})
  } else {
    res.send({'ok': false, 'msg': '用户不存在'})
  }
})
let server = app.listen(8088, () => {
  let host = server.address().address
  let port = server.address().port
  console.log("应用实例,访问地址为 http://%s:%s", host, port)
})

此时,在地址栏输入 http://localhost:8088/login?user=zhang&pass=123 可以看到返回一个登录成功的json。输入其他则返回登录失败。

post请求的处理

要解析 post 请求的请求体,需要使用到中间件 body-parser 解析post请求的请求体,比如:

const express = require('express')
const bodyParser = require('body-parser')
const app = express()
app.use(bodyParser.urlencoded())
app.post('/user', (req, res) => {
  console.log(req.body)
})
let server = app.listen(8088, () => {
  let host = server.address().address
  let port = server.address().port
  console.log("应用实例,访问地址为 http://%s:%s", host, port)
})

解析出的 req.body 即为请求体。

bodyParser.urlencoded() 还支持参数传入,比如:

app.use(bodyParser.urlencoded({
  extended: false,
  limit: 2 * 1024 * 1024
}))

extended 为扩展模式 limit 为接收限制大小

MIT Licensed | Copyright © 2018-present 滇ICP备16006294号

Design by Quanzaiyu | Power by VuePress