【问题标题】:Apollo Server 2 + Express: req.body missing on post handlerApollo Server 2 + Express:后处理程序中缺少 req.body
【发布时间】:2019-03-15 23:14:42
【问题描述】:

在版本 1 中可以使用此功能,但整个服务器配置已更改。这就是我在将 bodyparser() 添加到 express 应用程序之后所拥有的,正如 Daniel 在 cmets 中所建议的那样:

    const server = new ApolloServer({
    typeDefs,
    resolvers,
    playground: {
        settings: {
            'editor.theme': 'light',
        }
    },
})

// Initialize the app
const app = express();
app.use(cors())
app.use(bodyParser.json())

server.applyMiddleware({
    app
})

app.post('/calc', function(req, res){
    const {body} = req;

    console.log("HOWDYHOWDYHOWDY", body) // <== body is {}

    res.setHeader('content-type', 'application/json')

    calculate(body)
        .then(result => res.send(result))
        .catch(e => res.status(400).send({error: e.toString()}))    
})

请求正文永远不会到达 app.post 处理程序,尽管处理程序被调用。不过,我看到它从浏览器中输出。有什么想法吗?

更新: Daniel 得到了正确答案,但我在使用的请求标头中遇到了另一个问题。一旦我解决了这个问题,邮政处理程序就会收到身体。

【问题讨论】:

    标签: graphql apollo-server


    【解决方案1】:

    Apollo 的中间件将 bodyparser 中间件专门应用于 GraphQL 端点——它不会影响您的服务器公开的任何其他路由。为了正确填充req.body,需要自己添加bodyparser中间件,例如:

    app.use(bodyParser.json())
    app.post('/calc', routeHandler)
    
    // or...
    app.post('/calc', bodyParser.json(), routeHandler)
    

    【讨论】:

    • 感谢您的回复,丹尼尔。我按照您的建议做了,并将更新我的原始帖子。现在我得到一个空的 JSON 对象,而不是未定义的。更好的?因此,如果没有附加到应用程序的 bodyparser 中间件,req.body 将是空的,我有点惊讶——我希望有一个文本正文。没有 bodyparser.json() = undefined; with = {}
    • req.body 默认情况下是未定义的(请参阅快速文档:expressjs.com/en/4x/api.html#req.body)您可能需要选择适当的解析器才能看到正确填充的正文,具体取决于您发送的内容。有关更多详细信息,请参阅此答案 (stackoverflow.com/a/47486182/6024220) 和 body-parser 文档。另请注意,如果您使用的是多部分实体,则需要一个不同的库,例如 multer。
    • 好的,学到了一些东西。我正在调用正确的 bodyparser,所以这不是问题。其他人似乎也有类似的问题。找不到与我在这里尝试做的事情的直接推论,但是当我找到答案时,我会发布它。
    • 您也可以尝试将您的 /calc 路由移到您的 applyMiddleware 调用之上,这样它就会在 apollo 对您的请求执行任何操作之前被调用并终止。
    • 是的,我确实尝试过,但没有效果。但是......原来我的客户端代码中的请求标头有问题(我忘记删除的一行),所以这是第二个问题。现在,无论 post 处理程序放在哪里,我都会看到一个主体(终于!)。将您的回答标记为答案。再次感谢。
    【解决方案2】:

    我也遇到了这个问题。通过将以下内容传递到标题中来修复它:

    Content-Type: application/json
    

    【讨论】:

      猜你喜欢
      • 2019-01-21
      • 2019-06-08
      • 1970-01-01
      • 2018-10-21
      • 1970-01-01
      • 1970-01-01
      • 2015-12-06
      • 2019-01-09
      • 1970-01-01
      相关资源
      最近更新 更多