Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error: .post() requires callback functions but got a [object Undefined] not working

there are several issues with the same theme, but I could not solve my problem.

Error: Route.post() requires callback functions but got a [object Undefined]
at Route.(anonymous function) [as post] (/home/kevin/proyectoApp/node_modules/express/lib/router/route.js:196:15)
at EventEmitter.app.(anonymous function) [as post] (/home/kevin/proyectoApp/node_modules/express/lib/application.js:481:19)
at module.exports (/home/kevin/proyectoApp/app/rutas.js:7:5)
at Object.<anonymous> (/home/kevin/proyectoApp/index.js:21:26)
at Module._compile (module.js:398:26)
at Object.Module._extensions..js (module.js:405:10)
at Module.load (module.js:344:32)
at Function.Module._load (module.js:301:12)
at Function.Module.runMain (module.js:430:10)
at startup (node.js:141:18)
at node.js:1003:3

Index.js

var express=require('express');
var app=express();
var morgan=require('morgan')
var mongoose=require('mongoose');
var bodyParser=require('body-parser');
var methodOverride=require('method-override');

mongoose.connect('mongodb://localhost/local');


app.use(express.static(__dirname+'/public'));
app.use(morgan('dev'));
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())


//Endpoints
require('./app/rutas.js')(app);


var server=app.listen(3001,function () {
var host = "localhost";
var port = server.address().port;

console.log('servidor escuchando en http://%s:%s', host, port);});
module.exports=app;

rutas.js

var Controller=require('./controller.js');
var User=require('./models/user.js');

module.exports=function(app){

app.get('/user/all',Controller.Read);

app.put('/user/all/:todo_id',Controller.Update);

app.post('/user/all',Controller.Create);

app.delete('/user/all/todo_id',Controller.Delete);


app.get('/',function(req,res){
console.log("Este si carga");
res.sendFile('./public/index.html');
});
 }

user.js

var mongoose=require('mongoose');
var Schema=mongoose.Schema;

var Schemausuario=new Schema({
nombre:String,
apellido:String,
username:{type:String,requiere:true,unique:true}
});

var User=mongoose.model('User',Schemausuario);

module.exports=User;

controller.js

var User=require('./models/user.js');

var Create=function (req,res){
var nombre=req.body.nombre;
var apellido=req.body.apellido;
var nick=req.body.username;
console.log("Datos"+nombre+apellido+nick);
User.create({
nombre:nombre,
apellido:apellido,
username:nick

},function(err,usr){

if( err) console.log("Error al crear el usuario");
else{
    console.log("Usuario creado correctamente");
}
});

User.find({},function(err,user){
if(err) console.log("Hay un error al buscar los usuarios");
else{
    console.log("Los usuarios encontrados son "+user)
       res.json(user);
            }        
});

};


var Read=function (req,res){

User.find({},function(err,user){
if(err) return console.log("error="+err);
else{
       res.json(user);
            }        
});
};



var Update=function(req,res){
User.update( {_id : req.params.todo_id},
                {$set:{nombre : req.body.nombre,apellido:    req.body.apellido, username: req.body.username}}, 
                function(err, persona) {
                    if (err)
                        res.send(err);

            // Obtine y devuelve todas las personas tras crear una de     ellas
            User.find(function(err, user) {
                if (err)
                    res.send("Ha habido un error"+err)
                console.log("Se va a enviar "+persona)
                res.json(user);
            });
        });
};


var Delete=function(req,res){

  User.remove({
    _id: req.params.todo_id
}, function(err, todo) {
    if(err){
        res.send("Hay un error hdp"+err);
    }
    else{
        console.log("Usuario eliminado correctamente")
    }
    });

    User.find({},function(err, todos) {
        if(err){
            res.send(err);
        }
        res.json(todos);
    });
};

module.exports={
Create:Create,
Update:Update,
Read:Read,
Delete:Delete
}

I use the version "express", "^ 4.13.3"

can you help me? thanks. any other details that I'll upload it finds omitted. any other details that I'll upload it finds omitted.

like image 780
Kevin AB Avatar asked Jan 18 '16 11:01

Kevin AB


10 Answers

Instead of this:

app.post('/user/all',Controller.Create);

You try for:

app.post('/user/all', function(req, res){
  Controller.Create
});
like image 79
Subburaj Avatar answered Oct 03 '22 15:10

Subburaj


In my case it was because I had a misspelling between the router and controller file. Check both so that they match, the error .POST() requires callback functions but got a [object Undefined] has nothing to do with the real problem.

like image 24
Ignacio Ara Avatar answered Oct 03 '22 14:10

Ignacio Ara


You are only missing

module.exports = app, or whatever you are exporting. This happened to me many times.

like image 40
Godstime Avatar answered Oct 03 '22 14:10

Godstime


You want to be sure to check that your spellings are correct for the export and the import. Also make sure your middleware are properly exported and imported.

From the code you are sharing, you should export each middleware individually as exports.Create, exports.Update etc. Setting up your export this way will make it possible to access it the way you are currently accessing it view the Controller variable in your rutas.js file.

like image 25
Rex Osariemen Avatar answered Oct 03 '22 14:10

Rex Osariemen


Another case, which I ran into. I was importing from the controller a method called

const { createTrade } = require(...)

But I also had

exports.createTrade = async (..) => { ...

In another part of this file I referenced the createTrade from the import but it was confused about using the exports.createTrade or the imported one. I had to switch to

const controller = require(...)

controller.createTrade
like image 33
Jason G Avatar answered Oct 03 '22 13:10

Jason G


I got this error when I declared the function in routes but forgot to define it in the controller.

like image 21
Snow Avatar answered Oct 03 '22 14:10

Snow


I was having the same issue the way i resolved it was i did comment every post command and then i tested all the post commands one by one and in the 2nd last command when i checked routuer there was a typo error and that was that function wasnt called.

like image 24
Ali Muhammad Khowaja Avatar answered Oct 03 '22 14:10

Ali Muhammad Khowaja


For me it was a simple, stupid typo.

I had module.export = { instead of module.exports = {

like image 24
user1118374 Avatar answered Oct 03 '22 13:10

user1118374


In my case this was due to a circular dependency in the file - file A imported functions from file B, but file B imported functions from file A.

like image 21
LachoTomov Avatar answered Oct 03 '22 13:10

LachoTomov


In my case, I've encountered this error when I have deleted a function in my controller.js file but forgot to remove it in the router definition.

for eg,

router.get('/', controller.getUsers);

So, in the above code, I've deleted that getUsers() function in the controller.js file but I still used it in the route definition. So after removing this useless route the problem gets solved. Hope this error helps someone.

like image 28
somesh Avatar answered Oct 03 '22 14:10

somesh