按标题固定获取项,始终将原始JSON返回null

问题描述

我只是从Fastify开始,然后遇到一个问题,即我开始创建一个get请求以按标题获取项目,但是当我尝试登录{时,它总是给我一个null的响应。 {1}}。

我的获取请求:

request.body

我在邮递员中的获取请求(作为代码):

// Get points by title
fastify.route({
    method: 'GET',url: '/pointz/title',handler: (request,reply) => {
        return request.body
    }
})

Screenshot of my input and output in Postman

预期结果将是请求返回一个包含正在发送的JSON的正文,因此我可以更改代码以返回值为curl --location --request GET 'http://localhost:3000/pointz/title' \ --header 'Content-Type: application/json' \ --data-raw '{ "title": "test" }' 来访问request.body.title

更新: 现在找到了解决方法。如果我将GET请求更改为POST请求,则其工作原理与预期的一样。但是我怀疑这是否被认为是好的做法。

解决方法

如本GitHub第GET request validated scheme body?节所述 body不应在GET请求中发送,a datailed answer about it 并默认将其忽略。

但是遗留代码可以,并且,如果您需要支持它,则必须使用原始请求:

const fastify = require('fastify')({ logger: true })
fastify.get('/',async (req) => {
  let body = ''
  for await (const data of req.raw) {
    body += data.toString()
  }
  return body
})
fastify.listen(3000)

然后您的curl命令将按预期运行。

const got = require('got')
got.get('http://localhost:3000/',{
  json: { hello: 'world' },allowGetBody: true
}).then(res => {
  console.log('Returned = ' + res.body)
})