TypeError:Router.use()需要中间件function,但得到一个对象

在新版本的express上有一些中间件的变化,我在这个问题上的一些其他post的代码做了一些改变,但我不能得到任何东西坚持。

我们已经事先做好了工作,但是我不记得是什么改变了。

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; 

由于版本原因,这个问题的答案似乎已经改变了。 感谢Nik

如果您使用的是2.x以上的expression式,则必须像下面的代码那样声明app.router。 请尝试replace您的代码

 app.use('/', routes); 

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

请点击这里获取有关app.router的更多信息

谢谢

在你的任何一个js页面中,你都缺less

 module.exports = router; 

检查并validation所有的JS页面

我有Anirudh发布的这个错误和解决scheme的帮助。 我build立了一个快速路由模板,并忘记了这个细微差别 – 很高兴这是一个简单的修复。

我想通过解释我的文件结构来澄清一下他的答案。

我典型的文件结构如下:

 /lib /routes 

---index.js (控制主导航)

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

(每个文件[在我的情况下,index.js在page-two内,尽pipepage-one也会有index.js] – 对于每个页面 – 使用app.METHOD或router.METHOD需要module.exports = router ; 最后)

如果有人想要,我会发布一个链接到github模板,使用最佳实践来实现快速路由。 让我知道

谢谢Anirudh! 为伟大的答案。

我得到相同的错误消息,但有一个不同的问题。 张贴为其他人坚持相同。

在重构时,我移植了get,post,put,delete函数到新的路由器文件,忘记了编辑path。 例:

不正确:

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

正确:

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

花了一段时间来发现,因为错误让我检查语法,我可能已经包装在一个对象的参数或我错过了module.exports =路由器;