TypeError: Router.use () требует функции промежуточного программного обеспечения, но получил неопределенный - PullRequest
0 голосов
/ 18 ноября 2018

Я новичок в 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'));
});

Приложение / index.js

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

module.exports={
     router: 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);
};

приложение / хелперы / 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 \ Все о NodeJS \ chatcat \ node_modules \ express \ lib \ router \ index.js: 458: 13) в функции. (E: \ STUDIES \ Node Technologies \ Все о NodeJS \ chatcat \ node_modules \ express \ lib \ application.js: 220: 21) в Array.forEach () в Function.use (E: \ STUDIES \ Node Technologies \ Все о NodeJS \ chatcat \ node_modules \ express \ lib \ application.js: 217: 7) на объекте. (E: \ STUDIES \ Node Technologies \ Все о 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)

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

@ 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
}

И вы упомянули, почему вы пишете такой код. Он ненадежный и масштабируемый. Да, вы сказали, что это правильно. Просто я пытался по-другому. В большинстве случаевЯ хотел бы следовать Класс маршрутизатора для монтирования различных 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'));
});
0 голосов
/ 19 ноября 2018

Давайте сделаем этот шаг за шагом, вернувшись назад:

В этой строке:

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, который никогда не подключается к вашему приложению.

В целом, существует, вероятно, значительно более простой способ сделать то, что вы сами »пытаюсь сделать.То, что именно вы пытаетесь выполнить, на самом деле не описано здесь, и реализация является достаточно неосновной, и я не могу точно сказать, что вы намеревались сделать, чтобы знать, как предложить упрощение.

В любом случае,Я объяснил вам, почему вы получили исходную ошибку.Надеюсь, вы можете взять его оттуда и исправить / упростить.

...