1

I am reasonably new to node express and am trying to set up a simple server with middleware to handle routing. The error I'm getting is TypeError: Router.use() requires a middleware function but got a Object The error is because of the app.get('/', require(routes)); line. Does anyone know what I need to put here as a middleware function?

//server.js
http = require('http');
let port = process.env.PORT || 3000;
let host = '127.0.0.1';
var express = require('express');
var app = express();
var routes = './api/routes/positions';

app.use('/', require(routes));

http.createServer(app).listen(port);
console.log('Listening at http://' + host + ':' + port);

//#########################
//positions.js
const express = require('express');
var router = express.Router();

router.get('/', (err, req, res, next) => {
    res.status(200).json({
    message: "hello from server"
    });
});

module.exports.router;

3 Answers 3

1

You are exporting the module in wrong way from positions.js file.

you need to write

module.exports = router

instead of,

module.exports.router

What you have written will bind a new key router to exports object, but haven't assigned any value to it and hence it goes back to default the empty object {}.

Now express was expecting a function but got object and hence the error. You can verify it by checking the require(routes) in server.js file.

Update (advice)

Please study this formatted version of your code.

const http = require('http');
const express = require('express');

const routes = require('./api/routes/positions');

const port = process.env.PORT || 3000;
const host = '127.0.0.1';

const app = express();

app.use('/', routes);

http.createServer(app).listen(port);
console.log('Listening at http://' + host + ':' + port);

If you want to read more project, you can read this boilerplate written by me. It's bit old, but may serve you well.

Sign up to request clarification or add additional context in comments.

Comments

1
#!/usr/bin/env node

/**
 * Module dependencies.
 */

var app = require('../app');
var debug = require('debug')('ag:server');
var http = require('http');

/**
 * Get port from environment and store in Express.
 */

var port = normalizePort(process.env.PORT || '3002');
app.set('port', port);

/**
 * Create HTTP server.
 */

var server = http.createServer(app);

/**
 * Listen on provided port, on all network interfaces.
 */

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

/**
 * Normalize a port into a number, string, or false.
 */

function normalizePort(val) {
  var port = parseInt(val, 10);

  if (isNaN(port)) {
    // named pipe
    return val;
  }

  if (port >= 0) {
    // port number
    return port;
  }

  return false;
}

/**
 * Event listener for HTTP server "error" event.
 */

function onError(error) {
  if (error.syscall !== 'listen') {
    throw error;
  }

  var bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port;

  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges');
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(bind + ' is already in use');
      process.exit(1);
      break;
    default:
      throw error;
  }
}

/**
 * Event listener for HTTP server "listening" event.
 */

function onListening() {
  var addr = server.address();
  var bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port;
  debug('Listening on ' + bind);
}

1 Comment

use these commands in command prompt . 1.express --hbs 2. npm install.
0

Try this one:

     //server.js
        let port = process.env.PORT || 3000;
        let host = '127.0.0.1';
        var express = require('express');
    var app = express();
    var routes = require('./api/routes/positions');

    http.createServer(app).listen(port);
    console.log('Listening at http://' + host + ':' + port);

    //#########################
    //positions.js
    const express = require('express');
    var router = express.Router();
    router.use('/', routes);
   app.use('/', routes);
    router.get('/', (err, req, res, next) => {
        res.status(200).json({
        message: "hello from server"
        });
    });

    module.exports = router;

2 Comments

Have you written module.exports in middle ware file and export your object
You have assign middle ware to your app instead of this you need to assign it in your router object, i have done change in code please check it

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.