Home > Back-end >  req.body returns undefined when I use express router, even though I used express.urlencoded
req.body returns undefined when I use express router, even though I used express.urlencoded

Time:04-13

Here is my server.js code:

const express = require("express");
const articleRouter = require("./routes/articles");
const app = express();

app.set("view engine", "ejs");

app.use("/articles", articleRouter);

app.use(express.urlencoded({ extended: true }));

app.get("/", (req, res) => {
  const articles = [
    {
      title: "Test Article 1",
      createdAt: new Date(),
      description: "Test description 1",
    },
    {
      title: "Test Article 2",
      createdAt: new Date(),
      description: "Test description 2",
    },
  ];
  res.render("articles/index", { articles: articles });
});

// app.post("/articles", (req, res) => {
//   console.log(req.body);
// });

app.listen(3000, () => {
  console.log("Listening on port 3000...");
});

This code (which I commented) works fine

app.post("/articles", (req, res) => {
  console.log(req.body);
});

But when I try to do the same thing with router, it returns undefined. Here is my articles.js code from routes folder:

const express = require("express");
const router = express.Router();

router.get("/new", (req, res) => {
  res.render("articles/new");
});

router.post("/", (req, res) => {
  console.log(req.body);
});

module.exports = router;

Here id new.ejs code, where the from is:

<body>
  <div >
    <h1 >New Article</h1>
    <form action="/articles" method="post">
      <%- include('_form_fields') %>
    </form>
  </div>
</body>

The problem occurs only when I try to do this in router file. I would be very thankful if anyone can tell me what exactly am I doing wrong?

CodePudding user response:

You need to use any router after using middlewares. I think using express.json() is required for parsing json from body of http request

app.use(express.urlencoded({ extended: true }));
app.use(express.json());
// ... any middleware
app.use("/articles", articleRouter);

CodePudding user response:

You should pass the app to the router file and then use it regularly like this:

 const articleRouter = require("./routes/articles");

 articleRouter(app);

in the articleRouter file:

module.exports = (app) => {
    app.post("/", (req, res) => {
        console.log(req.body);
    });
}
  • Related