TypeError: Router.use() requires a middleware function but got a undefined

TypeError: Router.use() requires a middleware function but got a undefined

各位 我是 NODEJS 的新手 我正在尝试进行闲聊 app.I 在 server.js. [=30] 中遇到路由问题=][ 在行 app.use('/',chatcat.router); ].我附上了下面的错误。谁能告诉我?。如何解决这个问题。提前致谢...

server.js

const express=require('express');

const app=express();

const chatcat=require('./app');

app.set('port',process.env.PORT || 8086);

app.use(express.static('public'));

app.set('view engine','ejs');

app.use('/',chatcat.router);

app.listen(app.get('port'),()=>{
    console.log('server is listening on port: ',app.get('port'));
});

app/index.js

const routes=require('./routes');

module.exports={
     router: routes() 
}

app/routes/index.js:

'use strict';

const h=require('../helpers');

console.log('routers/index outside');

module.exports=()=>{

    console.log('routers/index inside');

    let routes={

        'get':{
            '/':(req,res,next)=>{
                res.render('login');
            },
            '/chat':(req,res,next)=>{
                res.render('chatroom');
            },
            '/rooms':(req,res,next)=>{
                res.render('rooms');
            }
        } ,
        'post':{
            '/chat':(req,res,next)=>{
              res.render('chatroom');
            }
        }    
    }

    return h.route12(routes);
};

app/helpers/index.js

'use strict';

const express=require('express');

const router=express.Router();

console.log('helpers/index outside');
let _registerRoutes=(routes,method)=>{

    for(let key in routes){
        if( (typeof routes[key] === 'object') && (routes[key] !==null) && !( routes[key] instanceof Array)){

            _registerRoutes(routes[key],key);
        }
        else{
            if(method === 'get'){
                console.log('get in');
                router.get(key,routes[key]);
            } 
            else if(method ==='post'){
                console.log('post in');
                router.post(key,routes[key]);
            }
        }
    }
}

let route12=routes=>{
    console.log('calling registerroutes');
    _registerRoutes(routes);
}

module.exports={
    route12
}

我收到如下错误:

E:\STUDIES\Node Technologies\NodeJS\chatcat\node_modules\express\lib\router\index.js:458 抛出新的 TypeError('Router.use() requires a middleware function but got a ' + gettype(fn)) ^

TypeError: Router.use() 需要一个中间件函数但是得到了一个未定义的 在 Function.use(E:\STUDIES\Node Technologies\All 关于 NodeJS\chatcat\node_modules\express\lib\router\index.js:458:13) 在功能。 (E:\STUDIES\Node Technologies\All 关于 NodeJS\chatcat\node_modules\express\lib\application.js:220:21) 在 Array.forEach () 在 Function.use(E:\STUDIES\Node Technologies\All 关于 NodeJS\chatcat\node_modules\express\lib\application.js:217:7) 在对象。 (E:\STUDIES\Node Technologies\All 关于 NodeJS\chatcat\server.js:13:5) 在 Module._compile (module.js:653:30) 在 Object.Module._extensions..js (module.js:664:10) 在 Module.load (module.js:566:32) 在 tryModuleLoad (module.js:506:12) 在 Function.Module._load (module.js:498:3)

让我们一步步倒退:

这一行:

app.use('/',chatcat.router);

你得到一个错误,说 chatcat.router 是未定义的,但它应该是一个函数。变量chatcat来源于此:

const chatcat=require('./app');

所以,在 app/index.js 中,你有这个:

const routes=require('./routes');

module.exports={
     router: routes() 
}

因此,这意味着您正在调用 require('./routes'); 应该 return 的函数并将其 return 值放入导出中。

当我们查看 app/routes/index.js 时,我们看到您正在导出一个函数,当调用 returns 时:

return h.route12(routes);

其中 h 来自:

const h=require('../helpers');

当我们查看 app/helpers/index.js 时,我们看到它正在导出 route12 函数:

let route12=routes=>{
    console.log('calling registerroutes');
    _registerRoutes(routes);
}

module.exports={
    route12
}

而且,您可以看到 route12() 在被调用时没有 return 任何东西。

因此你最终得到 undefined


因此,快速而肮脏的解决方法是使 route12() return 成为您希望中间件函数成为的函数。

但是,老实说这段代码非常混乱。看看仅仅找出 chatcat.router 实际应该是什么就需要做多少工作。这不应该这么困难。您在顶层导入和实际实现之间放置了一大堆中间文件,所有这些层都没有增加任何价值。他们所做的只是一些晦涩难懂的事情。而且,由于这是一个中间件功能,所以您不会在很多其他地方使用相同的中间件功能。

有许多不同的方法可以清理它,但我建议将中间件函数放在它自己的模块中,然后 require() 直接放入。如果中间件功能需要访问其他功能,则让它 require() 在它需要的地方。模块化通常应该尽可能浅。您不必遵循一系列不会增加任何价值的必需模块才能进入实际实施。


这里似乎也存在概念问题。 app.use() 应该用于安装中间件(参与处理传入请求的请求处理程序)。但是,不仅 route12() 没有 return 任何可以用作中间件的东西,甚至看起来都不像是生活的目的。当我们查看 _registerRoutes() 时,您似乎正在尝试重新实现 Express 已经为您提供的功能,但它看起来像是一个错误的实现,因为您假设它传递了第二个参数 method你自己的代码不会传递给它,然后它里面的代码试图把东西放在一个永远不会连接到你的应用程序的 router 上。

总的来说,可能有一种更简单的方法来完成您想要做的任何事情。此处并没有真正描述您要完成的具体任务,而且实现方式非常离谱,我无法完全判断您打算做什么以了解如何提出简化建议。

无论如何,我已经向您解释了为什么会出现您原来的错误。希望你能从那里得到它 fix/simplify.

@jfriend00 感谢您花宝贵的时间来解决我的 error.I 已经按照您的建议解决了错误...请参阅下面的代码我更改了什么在

app/helpers/index.js:

'use strict';

const express=require('express');

const router=express.Router();

console.log('helpers/index outside');
let _registerRoutes=(routes,method)=>{
    
    for(let key in routes){
        if( (typeof routes[key] === 'object') && (routes[key] !==null) && !( routes[key] instanceof Array)){
            
            _registerRoutes(routes[key],key);
        }
        else{
            if(method === 'get'){
                console.log('get in');
                router.get(key,routes[key]);
            } 
            else if(method ==='post'){
                console.log('post in');
                router.post(key,routes[key]);
            }
        }
    }
    return router;
}


let route12=routes=>{
    console.log('calling registerroutes');
    let x= _registerRoutes(routes);
    return x;
}

module.exports={
    route12
}

你提到你为什么要写这样的代码它不可靠 scalable.Yes 你说的是 right.Just 我试过不同的 way.Most 次我想按照 路由器 class 为您的 suggestions.and 安装不同的 API's.Thankyou 我附上了最新的代码可以吗?我应该遵循这种方式吗? 纠正我如果我错了。

app/index.js


'use strict';

const express=require('express');

const router=express.Router();

router.get('/',(req,res)=>{
    res.render('login');
});

router.get('/chat',(req,res)=>{
    res.render('chatroom');
});

router.get('/rooms',(req,res)=>{
    res.render('rooms');
});

router.get('/info',(req,res)=>{
    res.send("<h1> Information Page </h1>");
});

module.exports={

    router:router
};
server.js

const express=require('express');

const app=express();

const chatcat=require('./app');

app.set('port',process.env.PORT || 8086);

app.use(express.static('public'));

app.set('view engine','ejs');

app.use('/',chatcat.router);

app.listen(app.get('port'),()=>{
    console.log('server is listening on port: ',app.get('port'));
});