rd9911
rd9911

Reputation: 135

ReactJS axios post: returns null when it comes/goes from/to backend

I am stuck on this problem for 2 days. I am sending POSTrequest from frontend to the backend (and other GET requests too but the problem is only with POST). However, when my data goes to the backend it does not post anything to the rest api even though response is 200 OK. That's why when in response it should have given the posted data, it can't find it and gives null. This is my POST code in backend index.js:

const { response, request } = require('express');
require('dotenv').config()
const express = require('express');
const morgan = require('morgan');
const Contact = require('./models/contact.cjs');
const cors = require('cors')
const app = express();
app.use(express.json())
app.use(express.static('build'))
app.use(cors())
morgan.token('body', req => {
    return JSON.stringify(req.body)
  })
app.use(morgan(':method :url :status :res[content-length] - :response-time ms :body'));

const generateId = () => {
    const randNum = Math.floor(Math.random() * 5000)
    return randNum;
}

app.post('/api/persons', (req, res) => {
    const body = req.body
    console.log(body)
    if (!body.name || !body.number) {
        return res.status(400).json({
            error: "missing data"
        })
    } else if (Contact.find({name: body.name})) {
        Contact.findOneAndUpdate({name: body.name}, {$set: {number: body.number}}, {new:true})
            .then(updatedContacts => 
                res.json(updatedContacts)
            )
            .catch(err => console.log(err))
    
    } else {
        const contact = Contact({
            id: generateId(),
            name: body.name,
            number: body.number,
            date: new Date()
        })
        contact.save()
            .then(savedContact => {
                console.log(savedContact)
                res.json(savedContact)
            })
            .catch(err => {
                console.log(err)
            })
    
    }
})

const PORT = process.env.PORT
app.listen(PORT, () => {
    console.log(`Server is working on ${PORT}`)
})

and this is how my frontend sends data to backend: contacts.js:


const create = (newObject) => {
    const readyToPost = {
        method: 'post',
        url: `${baseUrl}`,
        data: newObject,
        headers: {'Content-Type': 'application/json'},
        json: true
      }
    const request = axios(readyToPost)
    return request.then(response => {
        console.log(response.data)
        return response.data
    })
    .catch(err => {
        console.log(err)
    })
}

And this is my react app's frontend.

Any ideas about why my data becomes null?

Any help would be appreciated!

Upvotes: 1

Views: 1993

Answers (1)

zx01
zx01

Reputation: 571

  • Due to the synchronous nature of your code, the condition Contact.find({name: body.name}) was always returning the Query object which is true due to which the else if block was getting executed even when there was no such document. After entering the else if block, since there was no match, so findOneAndUpdate() was returning null.
  • Use findOne() instead of find(). find() returns a cursor which is empty but true whereas findOne() returns the first document matched (if matched) or else it will return null (if not matched).
// index.js (Backend)

app.post("/api/persons", async (req, res) => {
    const body = req.body;
    if (!body.name || !body.number) {
      return res.status(400).json({
        error: "missing data",
      });
    }

    // Using findOne() instead of find(). Returns null if record not found.
    const existing = await Contact.findOne({ name: body.name });
    if (existing) {
      Contact.findOneAndUpdate(
        { name: body.name },
        { $set: { number: body.number } },
        { new: true }
      )
        .then((updatedContacts) => {
          console.log(updatedContacts);
          res.status(200).json(updatedContacts);
        })
        .catch((err) => console.log(err));
    } else {
      const contact = Contact({
        id: generateId(),
        name: body.name,
        number: body.number,
        date: new Date(),
      });
      contact
        .save()
        .then((savedContact) => {
          console.log(savedContact);
          res.status(201).json(savedContact);
        })
        .catch((err) => {
          console.log(err);
        });
    }
  });

Upvotes: 1

Related Questions