错误:.post() 需要回调函数,但 [object Undefined] 不起作用

Posted

技术标签:

【中文标题】错误:.post() 需要回调函数,但 [object Undefined] 不起作用【英文标题】:Error: .post() requires callback functions but got a [object Undefined] not working 【发布时间】:2016-04-23 13:29:10 【问题描述】:

同一主题有几个问题,但我无法解决我的问题。

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

索引.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

我用的是“express”、“^ 4.13.3”的版本

你能帮帮我吗?谢谢。 我将上传的任何其他细节都被省略了。 我将上传的任何其他细节都被省略了。

【问题讨论】:

我按照this Stack Overflow response中的详细信息解决了这个问题 【参考方案1】:

而不是这个:

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

你尝试:

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

【讨论】:

@Kevin AB 接受答案,如果它真的解决了你的问题。以便对其他人有所帮助。 @KevinAB 嗨,你能解释一下为什么这不起作用:app.post('/user/all',Controller.Create); 我看不出这个问题:Controller.Create = function(req, res) ... 你能解释一下吗?? @Subburaj 使用您的解决方案修复了错误,但其他功能不起作用。导出和导入时出现了一些错误,现在 Controller.create 可以正常工作。谢谢【参考方案2】:

在我的情况下,这是因为我在路由器和控制器文件之间拼写错误。检查两者是否匹配,错误.POST() requires callback functions but got a [object Undefined]与真正的问题无关。

【讨论】:

你说得对,这与真正的问题无关。对我来说,我错误地导出了函数。 对我来说,这是我复制粘贴时忘记重命名路由器中的新功能的地方。【参考方案3】:

你只是错过了

module.exports = 应用程序, 或您要导出的任何内容。这在我身上发生了很多次。

【讨论】:

这是这种特定错误类型的确切问题。缺少导出,可能在控制器文件中。 “小东西会杀人。” ——布什,“小事” 这里要补充一点:复制粘贴时检查函数名【参考方案4】:

是的,Subburaj 是正确的, 在 app.js 中实现

app.post('/sign', function (req, res) 
    LoginController.authenticate
);

这可以解决问题

【讨论】:

【参考方案5】:

始终确保导出名称与导入名称相同

//Function Exported
exports.isAuthenticatedUser = catchAsyncErrors(async(req, res, next) => 



//Function Imported
const isAuthenticatedUser = require('../middlewares/auth');

【讨论】:

【参考方案6】:

对我来说,这是一个简单而愚蠢的错字。

我有 module.export = 而不是 module.exports =

【讨论】:

【参考方案7】:

这个错误通常是你错误地以错误的方式导入函数,或者可能是拼写错误 controllerroute 都有问题。

我在从控制器导出函数时遇到了这个问题。

exports.addCategory = (req,res) => 

但是当我在我正在做的路线中导入它时

const addCategory = require('../Controllers/Category')

改为

const addCategory) = require('../Controllers/Category')

您在导入时看到 addCategory 周围的花括号 所以,我正在导入整个函数,这是错误的

【讨论】:

【参考方案8】:

您要确保检查您的拼写对于导出和导入是否正确。还要确保您的中间件正确导出和导入。

从您共享的代码中,您应该将每个中间件单独导出为 exports.Createexports.Update 等。以这种方式设置导出将使您能够以当前访问它的方式访问它,查看 rutas.js 文件中的 Controller 变量。

【讨论】:

【参考方案9】:

在我的情况下,这是由于文件中的循环依赖关系 - 文件 A 从文件 B 导入函数,但文件 B 从文件 A 导入函数。

【讨论】:

【参考方案10】:

我遇到的另一个案例。我正在从控制器导入一个名为

的方法
const  createTrade  = require(...)

但我也有

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

在该文件的另一部分中,我从导入中引用了 createTrade,但对于使用 exports.createTrade 或导入的感到困惑。我不得不切换到

const controller = require(...)

controller.createTrade

【讨论】:

【参考方案11】:

我遇到了同样的问题,我解决它的方式是我确实评论了每个发布命令,然后我一个一个测试了所有发布命令,当我检查路由器时,在第二个最后一个命令中出现了拼写错误,那就是那个函数没有被调用。

【讨论】:

【参考方案12】:

我解决了这个问题添加

module.exports = new ExampleController();

只需添加new

【讨论】:

【参考方案13】:

在我的例子中,我在我的 controller.js 文件中删除了一个函数但忘记在路由器定义中删除它时遇到了这个错误。

例如,

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

所以,在上面的代码中,我已经删除了 controller.js 文件中的 getUsers() 函数,但我仍然在路由定义中使用了它。因此,在删除这条无用的路线后,问题就解决了。希望这个错误对某人有所帮助。

【讨论】:

【参考方案14】:

不要像这样导出你的控制器

module.exports.createPost = () => ..

而不是像这样导出

module.exports = 
    createPost,

并像这样导入控制器,

postRouter.post("/createNew_post", postControllers.createPost);

【讨论】:

【参考方案15】:

当我在路由中声明函数但忘记在控制器中定义它时出现此错误。

【讨论】:

【参考方案16】:

我有同样的错误,这是我的错误:

控制器:

module.exports = cargarArchivo;

路线:

const  cargarArchivo  = require('../controllers/uploads');
const  Router  = require('express');
const router = Router();

router.post( '/', cargarArchivo )

错误:

Error: Route.post() requires a callback function but got a [object Object]

解决方案:在控制器更改中:

module.exports = cargarArchivo;

为:

module.exports = 
  cargarArchivo

问题是我将常量导出为常量,而不是将其导出为控制器中的属性,然后将其作为属性导入。它必须双向匹配。

【讨论】:

以上是关于错误:.post() 需要回调函数,但 [object Undefined] 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

ajax回调函数回调无法获取返回值

利用闭包向post回调函数传参数

封装的AJAX

错误:Route.get() 需要回调函数,但在 app.js 中获得了 [object Undefined]

Route.delete() 需要一个回调函数,但得到一个 [object Undefined]

Route.get() 需要一个回调函数但得到一个 [object Object]