Search code examples
node.jsmongodbexpresspostman

req.body working for POST request but not for PUT request


Actually i am updating an array in my api and after updating the array i am only getting the mongodb default id. It seems that the req.body.something is not defined although the req.body is defined. And i am using all middlewares properly like body-parser

This is the server.jscode

/* eslint-disable no-unused-vars */
/* eslint-disable no-undef */
const mongoose = require('mongoose')
const express = require('express')
const cors = require('cors')
// const bodyParser = require('body-parser')
const userRouters = require('./routes/user.js')
const podcastRouter = require('./routes/pocasts.js')
// const methodOverride = require('method-override')
const port = 8080
const app = express()

// app.use(bodyParser.json())
app.use(express.json())
app.use(express.urlencoded({extended: true}));
// app.use(express.methodOverride());

app.use(cors({
    credentials: true,
}))

//routes
app.use('/',userRouters)
app.use('/api/podcasts' , podcastRouter)

app.post('/api/podcasts',(req,res)=>{
    res.send("This is the api page")
})

app.post('/login',(req,res)=>{
    res.send("This is the login page")
})

app.post('/signup',(req,res)=>{
    res.send("This is the signup page")
    res.json(req.body)
})

const DB = "mongodb+srv://fk28:farhankhan123@cluster0.fq2ibrs.mongodb.net/test"

mongoose.connect(DB , {
    useNewUrlParser:true,
    useUnifiedTopology:true
}).then(()=>{
    console.log("connection successful")
}).catch((err)=>{
    console.log(err)
})

app.listen(port , ()=>{
    console.log("listening to port",port)
})

You can see that i have used bodyparser and other middleware. And also placed them before routers.

This is the update code

const Update =async (req,res)=>{
    const _id = req.params.id
    // const { ...data } = req.body
    const bodycontent = req.body

    try{
        const UpdatedPodcast = await Podcasts.updateOne({
            _id
        },
        {
            $push:{
                Episodes:[{
                    EpisodeNo:bodycontent.EpisodeNo,
                    EpisodeName:bodycontent.EpisodeName,
                    EpisodeDescription:bodycontent.EpisodeDescription
                }]
        }
        },
        {
            upsert:true,
            new:true
        }
        )
        console.log(req.body.EpisodeNo,req.body.EpisodeName,req.body.EpisodeDescription)
        console.log(req.body)
        res.send(UpdatedPodcast)
    }catch(err){
        res.status(500).json({
            message:"Error in updating the data"
        })
    }
}

Here i am consolling the req.body and also req.body.something

This is the consolled output

undefined undefined undefined
{
  Episodes: {
    EpisodeNo: 3,
    EpisodeName: 'All About Cooking',
    EpisodeDescription: 'Cooking is fun'
  }
}

This the api output

{
"_id": "646e2cc2040b492346842b34"
},

I am using Postman to make request

This is the POSTMAN request

{
    
    "Episodes": 
        {
            "EpisodeNo": 3,
            "EpisodeName": "All About Cooking",
            "EpisodeDescription": "Cooking is fun"
        }
    
}

I have used all middlewares but then also getting req.body.something as undefined. I am expecting where i am only getting default mongodb id i , i should get the updated data too.


Solution

  • Your EpisodeNo, EpisodeName, EpisodeDescription is a nested object properties, because you pass in nested JSON in the request.

    So get the value like this instead:

    const {EpisodeNo, EpisodeName, EpisodeDescription} = req.body.Episodes

    Or you can pass in each property without nested.

    { "EpisodeNo": 3, "EpisodeName": "All About Cooking", "EpisodeDescription": "Cooking is fun" }