Apollo Server 2 + Express:post 处理程序中缺少 req.body

Jef*_*ery 3 graphql apollo-server

在版本 1 中可以正常工作,但整个服务器配置已更改。这就是我在按照 Daniel 在评论中的建议将 bodyparser() 添加到 Express 应用程序后所拥有的:

    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()}))    
})
Run Code Online (Sandbox Code Playgroud)

尽管调用了处理程序,但请求正文永远不会到达 app.post 处理程序。不过,我看到它是从浏览器中发出的。有任何想法吗?

更新: 丹尼尔有正确的答案,但我在使用的请求标头中遇到了另一个问题。一旦我解决了这个问题,邮件处理程序就会收到正文。

Dan*_*den 6

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

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

// or...
app.post('/calc', bodyParser.json(), routeHandler)
Run Code Online (Sandbox Code Playgroud)

  • req.body 默认情况下未定义(请参阅express 文档:https://expressjs.com/en/4x/api.html#req.body)您可能需要选择适当的解析器才能看到正确填充的正文,具体取决于什么你正在发送。有关更多详细信息,请参阅此答案(/sf/answers/3324032771/)和 body-parser 文档。另请注意,如果您使用的是多部分主体,则需要不同的库,例如 multer。 (2认同)