Il y a eu quelques changements de middleware sur la nouvelle version d'Express et j'ai apporté quelques modifications à mon code par rapport à d'autres articles sur ce sujet, mais je ne peux rien en tenir.
Nous l'avions déjà fait mais je ne me souviens plus du changement.
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;
Il semble que la réponse à cette question ait changé pour des raisons de gestion de versions. Merci à Nik
Si vous utilisez Express ci-dessus 2.x, vous devez déclarer app.router comme ci-dessous le code S'il vous plaît essayez de remplacer votre code
app.use('/', routes);
avec
app.use(app.router);
routes.initialize(app);
S'il vous plaît cliquez ici pour obtenir plus de détails sur app.router
Merci
app.router est amorti dans express 3.0+. Si vous utilisez Express 3.0+, reportez-vous à la réponse d'Anirudh ci-dessous.
Dans l'une de vos pages JS vous manque
module.exports = router;
Vérifiez et vérifiez toutes vos pages JS
Solution simple si vous utilisez Express et Doing
const router = express.Router();
assurez-vous de
module.exports = router ;
à la fin de votre page
Je pense que vous n'avez pas exporté votre routeur.
module.exports = router; //what ever your export router name.
J'ai eu cette erreur et l'aide de solution qui a été posté par Anirudh. J'ai construit un modèle pour le routage express et j'ai oublié cette nuance - je suis content que ce soit une solution de facilité.
Je voulais éclaircir un peu sa réponse pour savoir où mettre ce code en expliquant la structure de mon fichier.
Ma structure de fichier typique est la suivante:
/lib
/routes
---index.js
(contrôle la navigation principale)
/page-one
/page-two
---index.js
(chaque fichier [dans mon cas, l'index.js dans la page deux, bien que la page un ait aussi un index.js] - pour chaque page - qui utilise app.METHOD
ou router.METHOD
doit avoir module.exports = router;
à la fin)
Si quelqu'un le souhaite, je posterai un lien vers le modèle github qui implémente le routage express en utilisant les meilleures pratiques. faites le moi savoir
Merci Anirudh !!! pour la bonne réponse.
Je recevais le même message d'erreur mais le problème était différent. Affichage pour les autres qui sont bloqués sur la même chose.
J'ai porté les fonctions get
, post
, put
, delete
dans le nouveau fichier du routeur lors du refactoring et j'ai oublié de modifier les chemins. Exemple:
Incorrect:
//server.js
app.use('/blog-posts', blogPostsRouter);
//routers/blogPostsRouter.js
router.get('/blog-posts', (req, res) => {
res.json(BlogPosts.get());
});
Correct:
//server.js
app.use('/blog-posts', blogPostsRouter);
//routers/blogPostsRouter.js
router.get('/', (req, res) => {
res.json(BlogPosts.get());
});
Il m'a fallu du temps pour repérer, car l'erreur m'avait demandé de vérifier la syntaxe où j'aurais peut-être enveloppé un argument dans un objet ou où j'ai manqué le module.exports = router;
vérifiez votre fichier routes.js
exemple mes 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)
vérifier la fin de routes.js
module.exports = routeur
sinon ajoutez et module.exports = routeur exécutez à nouveau
Si votre erreur est: "TypeError: Route.post () ou Route.get () requiert la fonction de middleware mais a un objet"
allez sur controller.js (à savoir, usersController) et vérifiez tous les noms de fonction que vous pourriez mal orthographier ou que vous avez donnés dans le fichier des itinéraires de fonction mais manqués dans les contrôleurs.
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)
})
}
dans routes.js j’ai donné deux itinéraires, mais aux contrôleurs, j’ai manqué de définir route pour
router.post ('/ users/login')
cela fera une erreur **
"TypeError: route.post () nécessite une fonction middleware mais a un objet"
**
Vérifiez votre tous ces fichiers:
var users = require('./routes/users');
var Users = require('./models/user');
var Items = require('./models/item');
Enregistrer correctement, Dans mon cas, un fichier a été oublié et génère la même erreur