Fastify
和其他的 API 一样,addContentTypeParser
被封装在定义它的作用域中了。这就意味着如果你定义在了根作用域中,那么就是全局可用,如果你定义在一个插件中,那么它只能在那个作用域和子作用域中可用。
Fastify 自动将解析好的 payload 添加到 Fastify request 对象,你能通过 request.body
访问。
你也可以用 hasContentTypeParser
API 来验证某个 content type 解析器是否存在。
if (!fastify.hasContentTypeParser('application/jsoff')){
// 将请求的主体/payload 解析为特定类型的代码
})application/jsoff
Body Parser
你可以看到,新的方法参数变成了 (req, body, done)
而不是 (req, done)
。
查看例子 example/parser.js
。
自定义解析器的选项
parseAs
(string):'string'
或者'buffer'
定义了如何收集进来的数据。默认是'buffer'
。- (number): 自定义解析器能够接收的最大的数据长度,比特为单位。默认是全局的消息主体的长度限制
Fastify 工厂方法
。
捕获所有
有些情况下你需要捕获所有的 content type。通过 Fastify,你只需添加'*'
content type。
fastify.addContentTypeParser('*', function (req, done) {
req.on('data', chunk => { data += chunk })
req.on('end', () => {
done(null, data)
})
})
对请求流 (stream) 执行管道输送 (pipe) 操作也是有用的。你可以如下定义一个 content 解析器:
之后通过核心 HTTP request 对象将请求流直接输送到任意位置:
app.post('/hello', (request, reply) => {
})
这里有一个将来访的 json line 对象完整输出到日志的例子: