TypeError: Router.use () erfordert eine Middleware-Funktion, hat jedoch ein Objekt

174

Es gab einige Middleware-Änderungen an der neuen Version von Express und ich habe einige Änderungen an meinem Code in Bezug auf einige der anderen Beiträge zu diesem Thema vorgenommen, aber ich kann nichts zum Festhalten bringen.

Wir hatten es vor der Arbeit, aber ich kann mich nicht erinnern, was die Änderung war.

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;

Es scheint, dass sich die Antwort auf diese Frage aus Versionsgründen geändert hat. Danke an Nik

Daten
quelle
3
Bitte zeigen Sie uns die aktuelle Fehlermeldung
thefourtheye
Was tun routes/indexund routes/userszurück?
Explosion Pills
1
NICHT DEFINIERT! Jemand (wahrscheinlich ich) hatte module.exports auf der Indexseite auskommentiert? Wie auch immer, ich habe die Zeile auskommentiert und verschiedene Routen hinzugefügt, und zumindest der Server startet.
Datum
@Datise - scheint, dass Sie falsche Antwort als Ihre Antwort markiert haben
Varun
Ich habe den gleichen Fehler erhalten, aber ich habe vergessen, den Controller zu exportieren
doobean

Antworten:

12

Wenn Sie Express über 2.x verwenden, müssen Sie app.router wie unten angegeben deklarieren. Bitte versuchen Sie Ihren Code zu ersetzen

app.use('/', routes);

mit

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

Bitte klicken Sie hier , um weitere Informationen zu erhalten app.router

Vielen Dank

Hinweis:

app.router wird in Express 3.0+ abgeschrieben. Wenn Sie Express 3.0+ verwenden, lesen Sie die Antwort von Anirudh weiter unten.

Rahul Radhakrishnan
quelle
10
Nur eine Anmerkung, dass app.router veraltet ist: github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x
Nik
11
Die wahrscheinlichste Lösung für die meisten dieser Fälle ist die Antwort von @ Anirudh unten.
geeky_monster
4
Ich fand diese Antwort irreführend. Die bessere Antwort ist von @Anirudh unten.
Drehscheibe
Die Antwort unten ist besser, wie andere erwähnt haben.
RaneWrites
935

Auf einer Ihrer js-Seiten fehlen Sie

module.exports = router;

Überprüfen und überprüfen Sie alle Ihre JS-Seiten

Anirudh
quelle
1
@ Anirudh Mind beschreibt auch den Grund für den Fehler
Sack Dahal
@ Anirudh, danke, es war hilfreich, aber wie exportiere ich Router hier in ES6? einfach export {router}gibt auch diesen Fehler
adi
3
@adi stackoverflow.com/questions/38550979/… los geht's :)
Anirudh
Es ist erwähnenswert, dass dies normalerweise ganz am Ende Ihrer Seite steht
AndrewLeonardi
3
Nun, mir fehlte ein sam Ende: |
Muhammad Umer
70

Einfache Lösung, wenn Sie Express verwenden und tun

const router = express.Router();

stellen Sie sicher, dass

module.exports = router ;

am Ende Ihrer Seite

Parikshit Hooda
quelle
Überschreibt dies nicht andere Eigenschaften unter den Exporten? Ich exportiere mehrere.
TheRealChx101
3

Ich habe die gleiche Fehlermeldung erhalten, hatte aber ein anderes Problem. Posting für andere, die auf dem gleichen stecken.

Ich portiert die get, post, put, deleteFunktionen , um neue Routerdatei während Refactoring, und vergessen , die Wege zu bearbeiten. Beispiel:

Falsch:

//server.js
app.use('/blog-posts', blogPostsRouter);

//routers/blogPostsRouter.js
router.get('/blog-posts', (req, res) => {
  res.json(BlogPosts.get());
});

Richtig:

//server.js
app.use('/blog-posts', blogPostsRouter);

//routers/blogPostsRouter.js
router.get('/', (req, res) => {
  res.json(BlogPosts.get());
});

Es hat eine Weile gedauert, bis ich festgestellt habe, dass ich aufgrund des Fehlers die Syntax überprüft habe, wo ich möglicherweise ein Argument in ein Objekt eingeschlossen habe oder wo ich das verpasst habe module.exports = router;

Michael Staton
quelle
Ich hatte einen ähnlichen Fehler, als ich auf eine Route verwies, die es nicht gab
NiallJG
3

Überprüfen Sie Ihre Datei route.js

Beispiel meine Routen.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)
      

Überprüfen Sie das Ende von route.js

module.exports = Router

Wenn nicht, fügen Sie hinzu und module.exports = Router wird erneut ausgeführt


Wenn Ihr Fehler lautet: "TypeError: Route.post () oder Route.get () erfordert Middleware-Funktion, hat aber ein Objekt."

Gehen Sie zu controller.js (dh usersController) und überprüfen Sie alle Funktionsnamen, die Sie möglicherweise falsch geschrieben oder in der Funktionsroutendatei angegeben, aber in Steuerelementen übersehen haben

const User = require('../models/user')
const express = require('express')
const router = express.Router()



module.exports.register = (req, res) => {
    const data = req.body
    const user = new User(data)
    user.save()
        .then((user) => {
            res.send(user)
        })
        .catch((err) => {
            res.json(err)
        })
}

In route.js habe ich zwei Routen angegeben, aber in Controllern habe ich die Route nicht definiert

router.post ('/ users / login')

Dies führt zu einem Fehler **

"TypeError: route.post () erfordert Middleware-Funktion, hat aber ein Objekt"

** **.

K23raj
quelle
Genau das habe ich vermisst! Die Exportanweisung !!
Saibbyweb
1

Ich hatte diese Fehler- und Lösungshilfe, die von Anirudh gepostet wurde. Ich habe eine Vorlage für das Express-Routing erstellt und diese Nuance vergessen - ich bin froh, dass es eine einfache Lösung war.

Ich wollte seiner Antwort, wo dieser Code abgelegt werden soll, eine kleine Klarstellung geben, indem ich meine Dateistruktur erläuterte.

Meine typische Dateistruktur lautet wie folgt:

/lib

/routes

---index.js (steuert die Hauptnavigation)

/page-one



/page-two



     ---index.js

(jede Datei [in meinem Fall die index.js auf Seite zwei, obwohl Seite eins auch eine index.js haben würde] - für jede Seite - die am Ende verwendet wird app.METHODoder router.METHODmuss module.exports = router;)

Wenn jemand möchte, werde ich einen Link zur Github-Vorlage veröffentlichen, die das Express-Routing mithilfe von Best Practices implementiert. Gib mir Bescheid

Danke Anirudh !!! für die tolle Antwort.

Joseph Zapantis
quelle
1

Überprüfen Sie alle diese Dateien:

var users = require('./routes/users');

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

Richtig speichern. In meinem Fall wurde eine Datei übersehen und der gleiche Fehler ausgegeben

Ramesh Sharma
quelle
0

In meinem Fall habe ich das Modul nicht exportiert. module.exports = router;

Usama Tahir
quelle
Wie unterscheidet sich das von den beiden obigen Antwortenmodule.exports = router;
Akin Okegbile
Ohh, ich kann sie unten sehen. Entschuldigung für die Vervielfältigung
Usama Tahir