Fastify

    和其他的 API 一样,addContentTypeParser 被封装在定义它的作用域中了。这就意味着如果你定义在了根作用域中,那么就是全局可用,如果你定义在一个插件中,那么它只能在那个作用域和子作用域中可用。

    Fastify 自动将解析好的 payload 添加到 Fastify request 对象,你能通过 request.body 访问。

    你也可以用 hasContentTypeParser API 来验证某个 content type 解析器是否存在。

    1. if (!fastify.hasContentTypeParser('application/jsoff')){
    2. // 将请求的主体/payload 解析为特定类型的代码
    3. })application/jsoff

    Body Parser

    你可以看到,新的方法参数变成了 (req, body, done) 而不是 (req, done)

    查看例子 example/parser.js

    自定义解析器的选项
    • parseAs (string): 'string' 或者 'buffer' 定义了如何收集进来的数据。默认是 'buffer'
    • (number): 自定义解析器能够接收的最大的数据长度,比特为单位。默认是全局的消息主体的长度限制Fastify 工厂方法

    捕获所有

    有些情况下你需要捕获所有的 content type。通过 Fastify,你只需添加'*' content type。

    1. fastify.addContentTypeParser('*', function (req, done) {
    2. req.on('data', chunk => { data += chunk })
    3. req.on('end', () => {
    4. done(null, data)
    5. })
    6. })

    对请求流 (stream) 执行管道输送 (pipe) 操作也是有用的。你可以如下定义一个 content 解析器:

    之后通过核心 HTTP request 对象将请求流直接输送到任意位置:

    1. app.post('/hello', (request, reply) => {
    2. })

    这里有一个将来访的 json line 对象完整输出到日志的例子: