99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

Fastify Content-Type 解析

2020-02-06 15:48 更新

Content-Type 解析

Fastify 原生只支持 'application/json' 和 'text/plain' content types。默認(rèn)的字符集是 utf-8。如果你需要支持其他的 content types,你需要使用 addContentTypeParser API。默認(rèn)的 JSON 或者純文本解析器也可以被更改.

和其他的 API 一樣,addContentTypeParser 被封裝在定義它的作用域中了。這就意味著如果你定義在了根作用域中,那么就是全局可用,如果你定義在一個(gè)插件中,那么它只能在那個(gè)作用域和子作用域中可用。

Fastify 自動(dòng)將解析好的 payload 添加到 Fastify request 對(duì)象,你能通過 request.body 訪問。

用法

fastify.addContentTypeParser('application/jsoff', function (req, done) {
  jsoffParser(req, function (err, body) {
    done(err, body)
  })
})

// 以相同方式處理多種 content type
fastify.addContentTypeParser(['text/xml', 'application/xml'], function (req, done) {
  xmlParser(req, function (err, body) {
    done(err, body)
  })
})

// Node 版本 >= 8.0.0 時(shí)也支持 async
fastify.addContentTypeParser('application/jsoff', async function (req) {
  var res = await new Promise((resolve, reject) => resolve(req))
  return res
})

你也可以用 hasContentTypeParser API 來驗(yàn)證某個(gè) content type 解析器是否存在。

if (!fastify.hasContentTypeParser('application/jsoff')){
  fastify.addContentTypeParser('application/jsoff', function (req, done) {
    // 將請(qǐng)求的主體/payload 解析為特定類型的代碼
  })application/jsoff
}

Body Parser

你可以用兩種方式解析消息主體。第一種方法在上面演示過了: 你可以添加定制的 content type 解析器來處理請(qǐng)求。第二種方法你可以在 addContentTypeParser API 傳遞 parseAs 參數(shù)。它可以是 'string' 或者 'buffer'。如果你使用 parseAs 選項(xiàng) Fastify 會(huì)處理 stream 并且進(jìn)行一些檢查,比如消息主體的 最大尺寸 和消息主體的長(zhǎng)度。如果達(dá)到了某些限制,自定義的解析器就不會(huì)被調(diào)用。

fastify.addContentTypeParser('application/json', { parseAs: 'string' }, function (req, body, done) {
  try {
    var json = JSON.parse(body)
    done(null, json)
  } catch (err) {
    err.statusCode = 400
    done(err, undefined)
  }
})

你可以看到,新的方法參數(shù)變成了 (req, body, done) 而不是 (req, done)。

查看例子 example/parser.js

自定義解析器的選項(xiàng)
  • parseAs (string): 'string' 或者 'buffer' 定義了如何收集進(jìn)來的數(shù)據(jù)。默認(rèn)是 'buffer'。
  • bodyLimit (number): 自定義解析器能夠接收的最大的數(shù)據(jù)長(zhǎng)度,比特為單位。默認(rèn)是全局的消息主體的長(zhǎng)度限制Fastify 工廠方法。

捕獲所有

有些情況下你需要捕獲所有的 content type。通過 Fastify,你只需添加'*' content type。

fastify.addContentTypeParser('*', function (req, done) {
  var data = ''
  req.on('data', chunk => { data += chunk })
  req.on('end', () => {
    done(null, data)
  })
})

在這種情況下,所有的沒有特定 content type 解析器的請(qǐng)求都會(huì)被這個(gè)方法處理。

對(duì)請(qǐng)求流 (stream) 執(zhí)行管道輸送 (pipe) 操作也是有用的。你可以如下定義一個(gè) content 解析器:

fastify.addContentTypeParser('*', function (req, done) {
  done()
})

之后通過核心 HTTP request 對(duì)象將請(qǐng)求流直接輸送到任意位置:

app.post('/hello', (request, reply) => {
  reply.send(request.req)
})

這里有一個(gè)將來訪的 json line 對(duì)象完整輸出到日志的例子:

const split2 = require('split2')
const pump = require('pump')
 fastify.addContentTypeParser('*', (req, done) => {
  done(null, pump(req, split2(JSON.parse)))
})
fastify.route({
  method: 'POST',
  url: '/api/log/jsons',
  handler: (req, res) => {
    req.body.on('data', d => console.log(d)) // 記錄每個(gè)來訪的對(duì)象
  }
})

關(guān)于輸送上傳的文件,請(qǐng)看該插件。



以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)