TypeError: Router.gebruik () Vereist middleware-functie, maar kreeg een object

Er zijn enkele middleware-veranderingen in de nieuwe versie van Express geweest en ik heb enkele wijzigingen in mijn code gemaakt rond enkele van de andere berichten over dit onderwerp, maar ik kan niets krijgen om te kleven.

We hadden het voor de hand werken, maar ik kan me niet herinneren wat de verandering was.

throw new TypeError('Router.use() requires middleware function but got a
        ^
TypeError: Router.use() requires middleware function but got a Object

node ./bin/www
js-bson: Failed to load c++ bson extension, using pure JS version
js-bson: Failed to load c++ bson extension, using pure JS version

/Users/datis/Documents/bb-dashboard/node_modules/express/lib/router/index.js:438
      throw new TypeError('Router.use() requires middleware function but got a
            ^
TypeError: Router.use() requires middleware function but got a Object
    at /Users/datis/Documents/bb-dashboard/node_modules/express/lib/router/index.js:438:13
    at Array.forEach (native)
    at Function.use (/Users/datis/Documents/bb-dashboard/node_modules/express/lib/router/index.js:436:13)
    at /Users/datis/Documents/bb-dashboard/node_modules/express/lib/application.js:188:21
    at Array.forEach (native)
    at Function.use (/Users/datis/Documents/bb-dashboard/node_modules/express/lib/application.js:185:7)
    at Object.<anonymous> (/Users/datis/Documents/bb-dashboard/app.js:46:5)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)

app.js

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
var session = require('express-session');
var MongoClient = require('mongodb').MongoClient;
var routes = require('./routes/index');
var users = require('./routes/users');
var Users = require('./models/user');
var Items = require('./models/item');
var Store = require('./models/store');
var StoreItem = require('./models/storeitem');
var app = express();
//set mongo db connection
var db = mongoose.connection; 
MongoClient.connect("mongodb://localhost:27017/test", function(err, db) {
  if(!err) {
    console.log("We are connected");
  }
});
// var MONGOHQ_URL="mongodb://localhost:27017/test" 
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
// uncomment after placing your favicon in /public
//app.use(favicon(__dirname + '/public/favicon.ico'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(session({
    secret: 'something',
    resave: true,
    saveUninitialized: true
}));
app.use('/', routes);
app.use('/users', users);
app.use(express.static(path.join(__dirname, 'public')));
// catch 404 and forward to error handler
// app.use(function(req, res, next) {
//     var err = new Error('Not Found');
//     err.status = 404;
//     next(err);
// });
// Make our db accessible to our router
app.use(function(req, res, next){
  req.db = db;
  next();
});
// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
    app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
            message: err.message,
            error: err
        });
    });
}
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
        message: err.message,
        error: {}
    });
});
module.exports = app;

Het lijkt erop dat het antwoord op deze vraag is gewijzigd vanwege versiebeheer. Met dank aan Nik


Antwoord 1, autoriteit 100%

Als je express above 2.xgebruikt, moet je app.routerdeclareren zoals onderstaande code. Probeer uw code te vervangen

app.use('/', routes);

met

app.use(app.router);
routes.initialize(app);

Klik klik hiervoor meer informatie over de app .router

Opmerking:

app.routerwordt afgeschreven in express 3.0+. Als je express 3.0+ gebruikt, raadpleeg dan Anirudh’s antwoordhieronder.


Antwoord 2, autoriteit 92%

Op een van je js-pagina’s mis je

module.exports = router;

Controleer en verifieer al uw JS-pagina’s


Antwoord 3, autoriteit 93%

Eenvoudige oplossing als je express gebruikt en doet

const router = express.Router();

Zorg ervoor dat

module.exports = router ;

Aan het einde van uw pagina


4, Autoriteit 92%

In mijn geval exporteerde ik de module niet.
module.exports = router;


5, Autoriteit 48%

U mist Router Exports-module en dat is de reden waarom deze fout aanwezig is.

Gebruik module.exports = router;en dat zou werken


6, Autoriteit 28%

Controleer uw routes.js-bestand

Voorbeeld mijn routes.js

   const express = require('express')
    const router = express.Router()
    const usersController = require('../app/controllers/usersController')
    const autheticateuser = require('../app/middlewares/authentication')
    router.post('/users/login', autheticateuser, usersController.login)
    router.post('/users/register', autheticateuser, usersController.register)
      

7, Autoriteit 8%

Ik had deze foutmelding en oplossingshulp die werd gepost door Anirudh. Ik heb een sjabloon gebouwd voor Express-routering en vergat deze nuance – blij dat het een gemakkelijke oplossing was.

Ik wilde een beetje verduidelijking geven aan zijn antwoord op waar deze code te plaatsen door mijn bestandsstructuur uit te leggen.

Mijn typische bestandsstructuur is als volgt:

/lib
/routes

---index.js(bestuurt de hoofdnavigatie)

/page-one
/page-two
     ---index.js

(elk bestand [in mijn geval de index.js binnen pagina-twee, hoewel pagina-een ook een index.js heeft] – voor elke pagina – die app.METHODof router.METHODmoet module.exports = router;aan het einde)

Als iemand wil, zal ik een link naar Gitub-sjabloon plaatsen die Express-routering implementeert met behulp van beste praktijken. Laat het me weten

Bedankt Anirudh !!! voor het grote antwoord.


8, Autoriteit 8%

Ik kreeg deze fout omdat ik een reeks bestanden als volgt had gebruikt:

app.use('/api/someName1', someName1);
app.use('/api/someName2', someName2);
...
app.use('/api/someNameN', someNameN);

Het probleem was dat hoewel ik het correct had aangegeven, een van de bestanden nog steeds leeg was. Laat het hier maar achter voor het geval iemand anders deze fout ook maakt. Om te voorkomen dat u tijd verspilt aan sommige van de andere oplossingen, aangezien het dezelfde foutmelding is die voor iedereen wordt weergegeven.

Veel plezier met hacken!


Antwoord 9, autoriteit 4%

Controleer al deze bestanden:

var users = require('./routes/users');
var Users = require('./models/user');
var Items = require('./models/item');

Bewaar correct, in mijn geval werd één bestand gemist en gaf dezelfde fout

Other episodes