How to get raw request body in Strapi controller

System Information
  • Strapi Version: 3.6.8
  • Operating System: Mac OS(Big Sur)
  • Database: MySql
  • Node Version: 14.0.0
  • NPM Version: 6.0.0
  • Yarn Version:

Having trouble getting the request body in Strapi contoller. I am trying to send email(provider I am using is SendGrid) after user makes a POST request. Trying to make email dynamic.

Post request body:

    type: "normal"

I have a route in \config\routes.json

      "method": "POST",
      "path": "/brochure",
      "handler": "brochure.index",
      "config": {
        "policies": []

In \controllers\brochure.js

const unparsed = require("koa-body/unparsed.js");

module.exports = {
  index: async (ctx) => {
    const unparsedBody = ctx.request.body[unparsed];

    console.log(unparsedBody); // undefined
     await strapi.plugins["email"]{
       from: "",
       subject: "testing Subject",
       text: `Heloooo ${}`,
     ctx.send("Email Sent");

In \config\middleware.js I have:

module.exports = {
  settings: {
    cors: {
      enabled: true,
    parser: {
      enabled: true,
      multipart: true,
      includeUnparsed: true,

Weird thing is that when I am logging ctx.request.body in terminal logs I can see that the POST object with name, email and type are visible, but when logging, for example, it is undefined.

Should be able to extract it like so

const {name, email, type} = ctx.request.body;
1 Like

For anyone is v4 that encounters this issue, this works:

const body = JSON.parse(ctx.request.body);
const { name } = body;

When using const unparsed = require("koa-body/unparsed.js");

1 Like

mine ctx.request.body is typed as unknown. this method does not work

Welcome :slight_smile:
I think in TS, if something is typed as unknown you can cast it to something different too :slight_smile: