Search code examples
node.jsreactjsmongodbmongoosereact-admin

React-Admin displays data from mongoDB but I cannot Edit


I'm using React Admin for the first time, and my users (coming from mongoDB) are displayed just fine. The problem occurs when I click the "edit" (or "delete") button on a specific user: it says "GET http://localhost:3002/api/users/2a1a3a61-f73b-4a01-b609-ae4bb815f59e 404 (Not Found)"

I use "http://localhost:3002/api/users" to make the GET req to mongoDB: "app.use('/api/users', require('./api/GetUsers'))" and "2a1a3a61-f73b-4a01-b609-ae4bb815f59e" is the id of the user I clicked.

I remember when I first started testing React Admin, that I was using jsonplaceholder.typicode to get data and the edit function was working as well, although, of course, would not persist on refresh.

What am I missing? Is the problem the fact that my api's (http://localhost:3002/api/users) purpose is only getting the data and not post/put also, maybe?

/api/GetUsers

const express = require('express');
const mongoose = require('mongoose');
const ContactUser = require('../DB/ContactUser');
const router = express.Router();

const getUsers = async (req, res) => {
    ContactUser.find()
        .exec((err, user) => {
            if(err){
                res.json(err);
            } else {
                res.setHeader('Access-Control-Expose-Headers', 'Content-Range');
                res.setHeader('Content-Range', 'users 0-20/20');
                res.json(user);
            }
        })
};

router.route('/').get(getUsers);
module.exports = router;

/DB/ContactUser

const mongoose = require('mongoose');

const contactUser = new mongoose.Schema({
    name: String,
    email: String,
    message: String,
    id: String
});

module.exports = mongoose.model('contactUser', contactUser);

Solution

  • You're missing a second route to retrieve not a list of users, but a single user. It will use the id in the URL to find one user. Something like:

    router.get('/:id', function(req, res) {
        ContactUser
            .findOne({ _id: req.params.id })
            .exec((err, user) => err ? res.json(err) : res.json(user));
    });