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
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
app.router wird in Express 3.0+ abgeschrieben. Wenn Sie Express 3.0 oder höher verwenden, lesen Sie unten die Antwort von Anirudh.
In einer Ihrer js-Seiten fehlen Ihnen
module.exports = router;
Überprüfen und überprüfen Sie alle Ihre JS-Seiten
Einfache Lösung, wenn Sie Express und Doing verwenden
const router = express.Router();
stellen Sie sicher, dass
module.exports = router ;
am Ende Ihrer Seite
Ich denke, Sie haben Ihren Router nicht exportiert.
module.exports = router; //what ever your export router name.
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.
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.
ü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"
**
Ü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