【问题标题】:GraphQL - POST body missing. Did you forget use body-parser middleware?GraphQL - 缺少 POST 正文。你忘记使用 body-parser 中间件了吗?
【发布时间】:2020-03-30 16:19:43
【问题描述】:

我在graphql 查询中不断收到以下错误,但不确定原因:

POST body missing. Did you forget use body-parser middleware?

我在这里做了什么奇怪的事情吗?我已经尝试过在线使用 body-parser 的不同建议,但似乎仍然无法修复它。

服务器:

require('babel-polyfill')

const express = require('express')
const router = require('./middleware')
const expressStaticGzip = require('express-static-gzip')
const app = express()
const port = process.env.EXPRESS_PORT || 4000
const bodyParser = require('body-parser')

app.use(/\/((?!graphql).)*/, bodyParser.urlencoded({ extended: true }))
app.use(/\/((?!graphql).)*/, bodyParser.json())
app.use('/search/data', expressStaticGzip('public'))
app.use('/', router)

app.listen(port, () => {
  console.log(`Server is running on port ${port}`)
})

路由器


const router = express.Router()
const server = new ApolloServer({
  typeDefs,
  resolvers,
  context: ({ req }) => {
    const { authorization = '' } = req.headers
    const universalFetch = (url, opts = {}) => {
      return fetch(url, {
        ...opts,
        headers: {
          ...opts.headers,
          authorization,
        },
      })
    }
    const request = createRpcClient(universalFetch)

    const methods = {}

    const catalog = Object.keys(methods).reduce((catalog, method) => {
      catalog[method] = params => request(methods[method], params)
      return catalog
    }, {})
    return { catalog, fetch: universalFetch }
  },
})

router.use(bodyParser.json())
router.use(bodyParser.text({ type: 'application/graphql' }))
router.use('*', renderer)
server.applyMiddleware({ app: router })

【问题讨论】:

  • @DanielRearden 谢谢!就是这样

标签: node.js reactjs express graphql


【解决方案1】:

applyMiddleware 已经为 GraphQL 端点添加了 body-parser - 无需再次应用它,这样做可能会导致您的问题。

此外,我希望applyMiddlewarerouter.use('*', renderer) 之前被调用——否则,我认为通配符路由也将用于/graphql

【讨论】:

    【解决方案2】:

    这个错误也是由正文中的不正确的json或正文中的一些其他问题引起的,例如不必要的错误不可见字符。因此,请检查生成的 json 是否存在错误以及请求正文中实际存在的内容。

    【讨论】:

      【解决方案3】:

      这个错误也可能因为body太大而引发。

      我在 NextJs 的自定义 api 路由中使用 apollo-server-micro 获得它。

      可以通过在 apollo 获取请求之前调用来自 microjson 函数来修复:

      import { json } from 'micro'
      import { ApolloServer } from 'apollo-server-micro'
      
      const server = new ApolloServer({/*config*/})
      
      const raiseBodyLimit: (handler: NextApiHandler) => NextApiHandler = (
        handler
      ) => async (req, res) => {
        if (req.headers['content-type'] !== 'application/json') {
          return handler(req, res)
        }
        
        await json(req, { limit: '1gb' }) // This is the trick to raise body limit
       
        return handler(req, res)
      }
      
      export default raiseBodyLimit(
          server.createHandler({
            path: '/api/graphql',
          })
      )
      
      
      

      我在apollo-server's github issue 看到了这个。

      以下是构建apollo server endpoint with next.js的一些信息

      【讨论】:

        【解决方案4】:

        在我的特殊情况下,客户端只是错过了带有“application/json”值的“Content-type”标头。添加后错误消息消失了。

        【讨论】:

          【解决方案5】:

          我忘记了标题 content-type: application/json

          【讨论】:

            猜你喜欢
            • 2021-09-05
            • 2019-09-11
            • 1970-01-01
            • 2021-02-15
            • 2018-10-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多