使用@apollo/server结合expressMiddleware时,已添加express.json()仍报'req.body is not set'错误的问题咨询
@apollo/server结合expressMiddleware时,已添加express.json()仍报'req.body is not set'错误的问题咨询
嘿,我之前也踩过这个坑,来帮你捋捋可能的问题和解决办法:
首先,这个错误看起来是Apollo Server拿不到请求体,但你确实加了express.json(),那咱们先从最常见的排查点开始:
先确认你的请求是不是符合要求
这个错误90%的情况都是请求本身的问题:- 你是不是用GET请求访问
/graphql了?Apollo Server处理查询的时候,GET请求是通过URL参数传查询内容的,不会携带请求体,自然会报这个错,必须用POST请求才行。 - 再检查请求头有没有加
Content-Type: application/json,如果这个请求头不对,express.json()根本不会去解析请求体,req.body自然是undefined。 - 最后看请求体是不是合法的JSON结构,比如要像这样:
{ "query": "query { getTodos { id Title Completed } }" }
- 你是不是用GET请求访问
再看看代码里的隐蔽问题
从你的代码来看,中间件的顺序是对的——express.json()确实在expressMiddleware之前挂载了,而且你也正确地等server.start()之后才挂载的GraphQL中间件,这部分没问题。不过可以试试这几个小调整:- 显式给
express.json()加个大小限制,避免因为请求体超过默认上限导致解析失败:app.use(express.json({ limit: '10mb' })); - 加个测试中间件,看看请求体在到达Apollo之前有没有被解析:
运行后发起请求,看看控制台打印的app.use("/graphql", (req, res, next) => { console.log("请求体内容:", req.body); next(); }, expressMiddleware(server));req.body是不是undefined——如果是,那说明express.json()确实没生效,大概率还是请求头的问题;如果有内容,那可能是Apollo Server的配置有问题(不过这种情况很少见)。
- 显式给
另外,你的代码里resolvers是空的,这个只会导致查询返回空数据,和当前的req.body错误没关系,不用太担心这个。
按照上面的步骤排查,应该能很快找到问题所在~
内容来源于stack exchange
相关产品推荐
相关产品推荐

