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` });
}
the name is wrong I guess deleteBootcamps in the import
...
deleteBootcamps
} = require('../controllers/bootcamps');