英文:
req.body working for POST request but not for PUT request
问题
You are encountering an issue where req.body.something
is undefined after updating an array in your API. It appears that you expect to get the updated data but only receive the MongoDB default ID. You've mentioned that you've used body-parser and other middleware correctly.
Here are some suggestions:
-
Ensure Middleware Order: Middleware order is important. Make sure you are using body-parser or similar middleware before your routes are defined. In your
server.js
, you have commented out body-parser, so you should useexpress.json()
andexpress.urlencoded()
for parsing JSON and form data. -
Request Structure: Check the structure of the request you are making in Postman. The request body structure should match the structure expected by your
Update
function. In this case, it should include anEpisodes
object withEpisodeNo
,EpisodeName
, andEpisodeDescription
. -
Logging: You are logging
req.body.EpisodeNo
,req.body.EpisodeName
, andreq.body.EpisodeDescription
in yourUpdate
function. Ensure that these values are present in the request body when you make the POST request. -
Response: The response you posted only includes the MongoDB default ID. Ensure that you are sending back the updated data in your response. You can modify your
Update
function to include the updated data in the response.
Without seeing the exact request and response data, it's challenging to pinpoint the exact issue. Make sure your request body matches the expected structure, and the data you want to update is being sent correctly in the request. Also, confirm that your Update
function is correctly handling and responding with the updated data.
英文:
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.js
code
/* 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.
答案1
得分: 1
您的EpisodeNo、EpisodeName和EpisodeDescription是嵌套对象属性,因为您在请求中传递了嵌套的JSON。
所以应该像这样获取值:
const { EpisodeNo, EpisodeName, EpisodeDescription } = req.body.Episodes
或者您可以单独传递每个属性,而不是嵌套。
{
"EpisodeNo": 3,
"EpisodeName": "All About Cooking",
"EpisodeDescription": "Cooking is fun"
}
英文:
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"
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论