TypeError:Router.use()需要中间件function

我正在使用express开发一个REST API。 当我尝试运行我的应用程序时,出现此错误:

TypeError: Router.use() requires middleware function but got a Object at Function.use (/Users/....../Desktop/NodeProjects/MyWebsite/node_modules/express/lib/router/index.js:458:13) at EventEmitter.<anonymous> (/Users/......./Desktop/NodeProjects/MyWebsite/node_modules/express/lib/application.js:219:21) at Array.forEach (native) at EventEmitter.use (/Users/........./Desktop/NodeProjects/MyWebsite/node_modules/express/lib/application.js:216:7) at Object.<anonymous> (/Users/............./Desktop/NodeProjects/MyWebsite/app.js:32:5) at Module._compile (module.js:398:26) at Object.Module._extensions..js (module.js:405:10) at Module.load (module.js:344:32) at Function.Module._load (module.js:301:12) at Function.Module.runMain (module.js:430:10) 

以下是我的代码:

app.js代码

  var express = require('express'); var http = require('http'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var nodemailer = require('nodemailer'); var url = require('url'); var routes = require('./routes/index'); var contacts = require('./routes/contacts'); var app = express(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); app.set('port', process.env.PORT || 3000); // uncomment after placing your favicon in /public //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.use('/', routes); app.use('/contacts', contacts); // catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); app.get('/contacts',function(request, response){ var get_params = url.parse(request.url, true).query; if (Object.keys(get_params).length == 0) { response.setHeader('content-type', 'application/json'); response.end(JSON.stringify(contacts.list())); } else { response.setHeader('content-type', 'application/json'); stringify(contacts.query_by_arg(get_params.arg, get_params.value)); } }); http.createServer(app).listen(app.get('port'), function() { console.log('Express server listening on port ' + app.get('port')); }); module.exports = app; 

Contacts.js代码

 var fs = require('fs'); //Read Json file function read_json_file() { var file = './data/contacts.json'; return fs.readFileSync(file); } //Parse the the file da exports.list = function() { return JSON.parse(read_json_file()); }; exports.query = function(number) { var json_result = JSON.parse(read_json_file()); var result = json_result.result; for (var i = 0; i < result.length; i++) { var contact = result[i]; if (contact.primarycontactnumber === number) { return contact; } } return null; }; exports.query_by_arg = function(arg, value) { var json_result = JSON.parse(read_json_file()); var result = json_result.result; for (var i = 0; i < result.length; i++) { var contact = result[i]; if (contact[arg] === value) { return contact; } } return null; }; exports.list_groups = function() { var json_result = JSON.parse(read_json_file()); var result = json_result.result; var resultArray = []; for (var i = 0; i < result.length; i++) { var groups = result[i].groups; for (var index = 0; index < groups.length; index++) { if (resultArray.indexOf(groups[index]) === -1) { resultArray.push(groups[index]); } } } return resultArray; }; exports.get_members = function(group_name) { var json_result = JSON.parse(read_json_file()); var result = json_result.result; var resultArray = []; for (var i = 0; i < result.length; i++) { if (result[i].groups.indexOf(group_name) > -1) { resultArray.push(result[i]); } } return resultArray; }; 

当我注释掉app.use('/contacts', contacts); 行在我的app.js然后它工作正常。 否则,我得到这个问题。 我已经尝试了很多东西来挖掘背后的原因,但都失败了。 请任何人都可以帮助我。

根据文档 , app.use是注册中间件; 您的contacts.js不包含任何中间件,它只包含您在实际/联系人路线中使用的帮助程序function。

正如你所指出的,评论它使一切正常工作。 没有必要做任何事情:)

你也需要你的路由之后移动你的404处理程序,否则它会在每个路由之前运行,因此你会看到404。 有关更多信息,请参阅error handling文档。