node.jsexpress

Can't separate middleware methods from routes


I tried to separate my routes and middleware methods in my back end API and get:

Route.delete() requires a callback function but got a [object Undefined]

If I comment the line .delete(deleteBootcamp); all other functions work (that function also worked before separating the routes).

server.js:

const express = require('express');
const dotenv = require('dotenv');

//route files
const bootcamps = require('./routes/bootcamps');

//load env files
dotenv.config({ path: './config/config.env' });

const app = express();

//mount routers
app.use('/api/v1/bootcamps', bootcamps);

const PORT = process.env.PORT || 5000;

app.listen(PORT, console.log(`Server running on ${process.env.NODE_ENV} mode on port ${PORT}`));

routes > bootcamps.js:

const express = require('express');

/*
const getBootcamps = require('../controllers/bootcamps');
const getBootcamp = require('../controllers/bootcamps');
const updateBootcamp = require('../controllers/bootcamps');
const addBootcamp = require('../controllers/bootcamps');
const deleteBootcamp = require('../controllers/bootcamps');
*/

const {
    getBootcamps,
    getBootcamp,
    updateBootcamp,
    addBootcamp,
    deleteBootcamp
} = require('../controllers/bootcamps');

const router = express.Router();

router
.route('/')
.get(getBootcamps)
.post(addBootcamp);

router
.route('/:id')
.get(getBootcamp)
.put(updateBootcamp)
.delete(deleteBootcamp); // thats where he is crying...

module.exports = router;

controllers > bootcamps.js:

//@desc     Get all bootcamps
//@route    /api/v1/bootcamps
//@access   Public
exports.getBootcamps = (req, res, next) => {
    res.status(200).json({succes: "true", msg: "Show all bootcamps"});
}

//@desc     Get a single bootcamp
//@route    /api/v1/bootcamp/:id
//@access   Public
exports.getBootcamp = (req, res, next) => {
    res.status(200).json({ succes: "true", msg: `Show bootcam ${req.params.id}` });
}

//@desc     Update bootcamp
//@route    /api/v1/bootcamps/:id
//@access   Private
exports.updateBootcamp = (req, res, next) => {
    res.status(200).json({ succes: "true", msg: `Bootcamp ${req.params.id} updated` });
}

//@desc     Add bootcamp
//@route    /api/v1/bootcamps/:id
//@access   Private
exports.addBootcamp = (req, res, next) => {
    res.status(200).json({ succes: "true", msg: "Bootcamp added" });
}

//@desc     Delete bootcamp
//@route    /api/v1/bootcamps/:id
//@access   Private
exports.deleteBootcamps = (req, res, next) => {
    res.status(200).json({ succes: "true", msg: `Bootcamp ${req.params.id} deleted` });
}

Solution

  • the name is wrong I guess deleteBootcamps in the import

      ...
    
      deleteBootcamps
    
    } = require('../controllers/bootcamps');