it-swarm.com.de

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

In der neuen Version von express wurden einige Änderungen an der Middleware vorgenommen, und ich habe einige Änderungen an meinem Code bezüglich einiger anderer Beiträge zu diesem Problem vorgenommen, aber ich kann nichts dazu bringen.

Wir hatten es vor der Hand, 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;

Anscheinend hat sich die Antwort auf diese Frage aus Gründen der Versionierung geändert. Danke an Nik

107
Datise

Wenn Sie express über 2.x verwenden, müssen Sie app.router wie im folgenden Code 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 app.router zu erhalten

Vielen Dank

Hinweis:

app.router wird in Express 3.0+ abgeschrieben. Wenn Sie Express 3.0 oder höher verwenden, lesen Sie unten die Antwort von Anirudh.

3

In einer Ihrer js-Seiten fehlen Ihnen 

module.exports = router;

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

608
Anirudh

Einfache Lösung, wenn Sie Express und Doing verwenden 

const router = express.Router();

stellen Sie sicher, dass 

module.exports = router ;

am Ende Ihrer Seite

27
Parikshit Hooda

Ich denke, Sie haben Ihren Router nicht exportiert.

module.exports = router;  //what ever your export router name.
19
Nitin Tyagi

Ich hatte diese Fehler- und Lösungshilfe, die von Anirudh gepostet wurde. Ich baute eine Vorlage für das Express-Routing und vergaß diese Nuance - froh, dass es eine einfache Lösung war. 

Ich wollte seine Antwort ein wenig erläutern, wo ich diesen Code einfügen kann, indem er meine Dateistruktur erläutert. 

Meine typische Dateistruktur sieht wie folgt aus:

/lib

/routes

---index.js (steuert die Hauptnavigation)

/page-one



/page-two



     ---index.js

(jede Datei [in meinem Fall die index.js in page-two, obwohl page-one auch eine index.js hätte) - für jede Seite, die app.METHOD oder router.METHOD verwendet, muss am Ende module.exports = router; vorhanden sein. 

Wenn jemand möchte, poste ich einen Link zu der Github-Vorlage, die das Express-Routing mithilfe von Best Practices implementiert. Gib mir Bescheid

Danke Anirudh !!! für die großartige Antwort.

1
Joseph Zapantis

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

Ich habe die Funktionen get, post, put, delete beim Refactoring in die neue Routerdatei portiert und habe vergessen, die Pfade 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 dauerte eine Weile, bis ich herausfand, wie der Fehler mich veranlasste, die Syntax zu überprüfen, wo ich möglicherweise ein Argument in ein Objekt geschrieben habe oder wo ich den module.exports = router; vermisst hatte.

1
Michael Staton

überprüfen Sie Ihre routes.js-Datei

beispiel meine 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)
      

überprüfen Sie das Ende von routes.js

module.exports = router

wenn nicht dort hinzufügen und module.exports = router erneut ausführen


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

gehen Sie zu controller.js (d. h. usersController) und überprüfen Sie alle Funktionsnamen, die Sie möglicherweise falsch geschrieben haben oder die Sie in der Funktionsroutendatei angegeben haben, die Sie jedoch in den Steuerelementen verpasst 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 routes.js habe ich zwei Routen angegeben, aber in Controllern habe ich es versäumt, die Route für zu definieren

router.post ('/ users/login')

das macht fehler **

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

**

0
K23raj

Überprüfen Sie alle diese Dateien:

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

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

Speichern Sie richtig. In meinem Fall wurde eine Datei verfehlt und der gleiche Fehler ausgegeben

0
Ramesh Sharma