Error: Route.get() requires a callback function but got a [object Undefined] at app.js

Tags: , ,



I dont know why off this error I have another model and almost the same route and the controllers but is not working this is the message: Error: Route.get() requires a callback function but got a [object Undefined] at Route. [as get] (/Users/ediechavero/Documents/Recipe-API/node_modules/express/lib/router/route.js:202:15) at Function.proto. [as get] (/Users/ediechavero/Documents/Recipe-API/node_modules/express/lib/router/index.js:510:19) at Object. (/Users/ediechavero/Documents/Recipe-API/routes/places-routes.js:22:8) at Module._compile (internal/modules/cjs/loader.js:1156:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1176:10) at Module.load (internal/modules/cjs/loader.js:1000:32) at Function.Module._load (internal/modules/cjs/loader.js:899:14) at Module.require (internal/modules/cjs/loader.js:1042:19) at require (internal/modules/cjs/helpers.js:77:18) at Object. (/Users/ediechavero/Documents/Recipe-API/app.js:62:15) at Module._compile (internal/modules/cjs/loader.js:1156:30) at Object.Module._extensions..js (in

//Controllers places this is the controllers file for the crud places
const Place = require('../models/Place');

exports.getAllPlacess = async (req, res) => {
  try {
    const places = await Place.find().populate('owner');
    res.status(200).json({ places });
  } catch (error) {
    res.status(400).json({ message: `${error}` });
  }
};

exports.getPlace = async (req, res) => {
  try {
    const { id } = req.params;
    const place = await (await Place.findById(id)).populate('owner');
    res.status(200).json({ place });
  } catch (error) {
    res.status(400).json({ message: `${error}` });
  }
};

exports.createPlace = async (req, res) => {
  try {
    const { name, typePlace, address } = req.body;
    const owner = req.user.id;

    const place = await Place.create({
      name,
      typePlace,
      address,
      owner,
    });
    res.status(201).json({ place });
  } catch (error) {
    res.status(400).json({ message: `${error}` });
  }
};

exports.updatePlace = async (req, res) => {
  try {
    const { id } = req.params;
    const { name, typePlace, address } = req.body;
    const place = await Place.findByIdAndUpdate(id, {
      name,
      typePlace,
      address,
      owner,
    });
    res.status(200).json({ place });
  } catch (error) {
    res.status(400).json({ message: `${error}` });
  }
};

exports.deletePlace = async (req, res) => {
  try {
    const { id } = req.params;
    await Place.findByIdAndDelete(id);
    res.status(200).json({ message: 'Deleted Recipe' });
  } catch (error) {
    res.status(400).json({ message: `${error}` });
  }
};



//Route this the file for the routes 
const express = require('express');
const router = express.Router();
const uploadConfig = require('../config/cloudinary');

const {
  getAllPlaces,
  getPlace,
  createPlace,
  updatePlace,
  deletePlace,
} = require('../controllers/places');

router.post('/upload', uploadConfig.single('photo'), (req, res, next) => {
  if (!req.file) {
    next(new Error('No file uploades'));
  }
  res.status(201).json({ secure_url: req.file.secure_url });
});

//CRUD PLACES

router.get('/places', getAllPlaces);
router.get('/places/:id', getPlace);
router.post('/places/create', createPlace);
router.put('/places/edit/:id', updatePlace);
router.delete('/places/delete/:id', deletePlace);

module.exports = router;

//app.js

require('dotenv').config();

const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser');
const express = require('express');
const mongoose = require('mongoose');
const logger = require('morgan');
const path = require('path');
const colors = require('colors');
const cors = require('cors');
const session = require('express-session');

mongoose
  .connect(process.env.DB, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
  })
  .then((x) =>
    console.log(
      `Connected to Mongo! Database name: "${x.connections[0].name}"`.cyan
        .underline.bold
    )
  )
  .catch((err) => console.error('Error connecting to mongo', err.red));

const app_name = require('./package.json').name;
const debug = require('debug')(
  `${app_name}:${path.basename(__filename).split('.')[0]}`
);

const app = express();

app.use(
  cors({
    credentials: true,
    origin: [process.env.FRONTENDPOINT],
  })
);

app.use(
  session({
    resave: false,
    saveUninitialized: true,
    secret: process.env.SECRET,
    cookie: { maxAge: 1000 * 60 * 60 },
  })
);

app.use(express.static(path.join(__dirname, 'public')));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(cookieParser());
app.use(logger('dev'));

const index = require('./routes/index');
app.use('/', index);

const recipe = require('./routes/recipe-routes');
app.use('/api', recipe);

const place = require('./routes/places-routes');
app.use('/api', place);

// Uncomment this line for production
// app.get('/*', (req, res) => res.sendFile(__dirname + '/public/index.html'));

module.exports = app;

Answer

It looks like there’s a difference in spelling where you export and where you import.

You are defining one export as this:

exports.getAllPlacess = function() { ... }

But, then importing it as this:

const {
  getAllPlaces,
  getPlace,
  createPlace,
  updatePlace,
  deletePlace,
} = require('../controllers/places');

Change this:

exports.getAllPlacess = function() { ... }

to this:

exports.getAllPlaces = function() { ... }


Source: stackoverflow