Reputation: 161
I am developing a REST API through node using express. When I try to run my application, I get this error:
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)
Below is my code:
app.js
Code
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;
Code of 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;
};
When I comment out the app.use('/contacts', contacts);
line in my app.js
then it works fine. Otherwise I get this issue. I have tried a lot to dig into the reason behind it but have failed. Can any one help me with this please.
Upvotes: 1
Views: 1164
Reputation: 131
As per the docs, app.use
is for registering middleware; your contacts.js doesn't contain any middleware, it just contains the helper functions you use inside the actual /contacts route.
As you noted, commenting it out makes everything work just fine. There's no need to do anything else :)
You'll also want to move your 404 handler after your routes, otherwise it'll be run before every route, hence the 404s you see. See the error handling docs for more info.
Upvotes: 1