1. 程式人生 > 實用技巧 >用內建 querystring 模組解析請求體資料

用內建 querystring 模組解析請求體資料

querystring 模組解析請求體資料

  1. Node.js 內建了一個 querystring 模組,專門用來處理查詢字串。通過這個模組提供的 parse() 函式,可以輕鬆把查詢字串,解析成物件的格式

  2. 程式碼碼

    // 匯入 express 模組
    const express = require('express')
    // 建立 express 的伺服器例項
    const app = express()
    // 4. 匯入 Node 內建模組 querystring
    const qs = require('querystring')
    
    // 解析表單資料的中介軟體
    app.use((req, res, next) => {
      
    // 定義中間價具體的業務邏輯 // 1. 定義一個 str 字串,專門用來儲存客戶端傳送過來的請求體資料 let str = '' // 2. 監聽 req 的 data 事件 req.on('data', (chunk) => { str += chunk }) // 3. 監聽 req 的 end 事件 req.on('end', () => { // 在 str 中存放的是完整的請求體資料 console.log(str) // 將字串格式的請求體資料,解析成物件 // 5. 呼叫 qs.parse() 方法,將查詢字串解析成物件 const
    body = qs.parse(str) console.log(body) }) }) app.post('/user', (req, res) => { res.send('ok') }) // 呼叫 app.listen方法,指定埠號並啟動 web 伺服器 app.listen(3000, () => { console.log('running……') })

將解析出來的資料物件掛載為 req.body

  1. 上游的中介軟體和下游的中介軟體及路由之間,共享同一份 reqres,因此,我們可以將解析出來的資料,掛載為 req 的自定義屬性,命名為 req.body

    ,供下游使用

案例程式碼

// 匯入 express 模組
const express = require('express')
// 建立 express 的伺服器例項
const app = express()
// 4. 匯入 Node 內建模組 querystring
const qs = require('querystring')

// 解析表單資料的中介軟體
app.use((req, res, next) => {
  // 定義中間價具體的業務邏輯
  // 1. 定義一個 str 字串,專門用來儲存客戶端傳送過來的請求體資料
  let str = ''
  // 2. 監聽 req 的 data 事件
  req.on('data', (chunk) => {
    str += chunk
  })

  // 3. 監聽 req 的 end 事件
  req.on('end', () => {
    // 在 str 中存放的是完整的請求體資料
    console.log(str)
    // 將字串格式的請求體資料,解析成物件
    // 5. 呼叫 qs.parse() 方法,將查詢字串解析成物件
    const body =  qs.parse(str)

    // 6. 將解析出來的資料物件掛載為 req.body 屬性
    req.body = body
    next()
  })
})

app.post('/user', (req, res) => {
  res.send(req.body)
})

// 呼叫 app.listen方法,指定埠號並啟動 web 伺服器
app.listen(3000, () => {
  console.log('running……')
})

將自定義中介軟體封裝為模組

  1. 為了優化程式碼的結構,我們可以把自定義的中介軟體函式,封裝為獨立的模組

  2. 程式碼如下:

  3. // custom-body-parser.js
    
    const qs = require('querystring')
    
    const bodyParser = (req, res, next) => {
      // 定義中間價具體的業務邏輯
      // 1. 定義一個 str 字串,專門用來儲存客戶端傳送過來的請求體資料
      let str = ''
      // 2. 監聽 req 的 data 事件
      req.on('data', (chunk) => {
        str += chunk
      })
    
      // 3. 監聽 req 的 end 事件
      req.on('end', () => {
        // 在 str 中存放的是完整的請求體資料
        console.log(str)
        // 將字串格式的請求體資料,解析成物件
        // 5. 呼叫 qs.parse() 方法,將查詢字串解析成物件
        const body =  qs.parse(str)
    
        // 6. 將解析出來的資料物件掛載為 req.body 屬性
        req.body = body
        next()
      })
    }
    
    module.exports = bodyParser
    // 對自定義的中介軟體進行模組化拆分
    
    // 匯入 express 模組
    const express = require('express')
    // 建立 express 的伺服器例項
    const app = express()
    
    // 1. 匯入自己封裝的中介軟體模組
    const customBodyParser = require('./017-custom-body-parser')
    // 2. 將自定義的中介軟體函式,註冊為全域性可用的中介軟體
    app.use(customBodyParser)
    
    app.post('/user', (req, res) => {
      res.send(req.body)
    })
    
    // 呼叫 app.listen方法,指定埠號並啟動 web 伺服器
    app.listen(3000, () => {
      console.log('running……')
    })