【问题标题】:TypeError: Router.use() requires a middleware function but got a undefinedTypeError:Router.use() 需要一个中间件函数,但有一个未定义的
【发布时间】:2019-04-21 06:16:27
【问题描述】:

我是 NODEJS 的初学者,我正在尝试做一个小型聊天应用程序。我在 server.js. [ 在 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 throw new TypeError('Router.use() 需要一个中间件函数但得到一个' + gettype(fn)) ^

TypeError:Router.use() 需要一个中间件函数但得到一个未定义 在 Function.use (E:\STUDIES\Node Technologies\All about NodeJS\chatcat\node_modules\express\lib\router\index.js:458:13) 在功能。 (E:\STUDIES\Node Technologies\All about NodeJS\chatcat\node_modules\express\lib\application.js:220:21) 在 Array.forEach () 在 Function.use (E:\STUDIES\Node Technologies\All about NodeJS\chatcat\node_modules\express\lib\application.js:217:7) 在对象。 (E:\STUDIES\Node Technologies\All about 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)

【问题讨论】:

    标签: node.js express router


    【解决方案1】:

    让我们一步一步倒退:

    在这一行:

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

    您收到一条错误消息,指出 chatcat.router 应该是一个函数时未定义。变量chatcat 来自于此:

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

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

    const routes=require('./routes');
    
    module.exports={
         router: routes() 
    }
    

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

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

    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() 在调用时不会返回任何内容。

    因此你最终得到undefined


    因此,快速而肮脏的解决方法是让route12() 返回一个函数,该函数是您想要的中间件函数。

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

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


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

    总体而言,无论您想要做什么,都可能有一种非常简单的方法。此处并未真正描述您要完成的工作,并且实现方式已经足够离谱,以至于我无法完全说出您打算做什么来知道如何提出简化建议。

    无论如何,我已经向您解释了为什么您会收到原始错误。希望你能从那里得到它并修复/简化。

    【讨论】:

      【解决方案2】:

      @jfriend00 感谢您抽出宝贵的时间来解决我的错误。我已按照您的建议解决了错误...请参阅下面的代码,我在

      中所做的更改

      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
      }

      您提到了为什么要编写这样的代码。它不可靠且可扩展。是的,您说的是对的。只是我尝试了不同的方式。大多数时候我想关注 Router 类 挂载不同的 API。谢谢您的建议。我附上了最新的代码可以吗?我要按照这种方式吗? 如果我错了,请纠正我。

      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'));
      });

      【讨论】:

        猜你喜欢
        • 2019-12-29
        • 1970-01-01
        • 2021-09-18
        • 1970-01-01
        • 1970-01-01
        • 2022-01-26
        • 2020-07-14
        • 2020-12-27
        • 2015-04-17
        相关资源
        最近更新 更多