简体   繁体   中英

Router.use requires middleware function?

So I'm trying to seperate my login routes in a seperate JS file called login_routes.js

I keep getting this specific error:

TypeError: Router.use() requires middleware function but got a Object at Function. (/Users/ethanthomas/Desktop/mean-stuff/express-server/node_modules/express/lib/router/index.js:446:13)

Not entirely understanding what it's asking me to implement ?

login_routes.js:

var express = require('express');
var app = express();

app.route('/login')

.get(function(req, res, next) {
    res.send('this is the login form');
})

.post(function(req, res, next) {
    console.log('processing');
    res.send('proccessing the login form!');
});

server.js:

var express = require('express');
var app = express();
var path = require('path');
var adminRoutes = require('./app/routes/admin_routes');
var loginRoutes = require('./app/routes/login_routes');

app.use('/admin', adminRoutes);
app.use('/login', loginRoutes);


//send our index.html file to the user for the home page
app.get('/', function(req, res) {
    res.sendFile(path.join(__dirname + '/index.html'));
});

//start the server
app.listen(1337);
console.log('leet is the magic port');

Your login_routes.js should look something like this (in the context of express):

 var express = require('express'); var router = express.Router(); // GET request to /login router.get('/', function(req, res, next) { // do something }); // POST request to /login router.post('/', function(req, res, next) { // do something }); module.exports = router; 

In your app.js you use

 var login_routes = require('./login_routes'); ... app.use('/login', login_routes); ... 

Have a look at the code generated by the express-generator module. That is a starting point for express webserver apps.

People have already offered hints at the solution in comments.

The first issue is that you need to export your "sub" app from login_routes.js . To do so, change this:

var app = express();

Into this:

var app = module.exports = express();

Secondly, you are—probably unintentionally—creating routes for GET /login/login and POST /login/login . To solve this, use this in login_routes.js :

app.route('/').get(...).post(...);

This is because the root path in your sub app (the one in login_routes.js ) will get mapped to the path used in app.use() in your main app ( server.js ).

Do like this:

login_routes.js:

exports.get = function( req, res ) {
  res.send('this is the login form');
};

exports.post = function( req, res ) {
  console.log('processing');
  res.send('proccessing the login form!');
};

server.js:

var loginRoutes = require('./app/routes/login_routes');

app.get('/login', loginRoutes.get);
app.put('/login', loginRoutes.post);

login_routes.js:

var express = require('express');
var app = express();

app.route('/login')

.get(function(req, res, next) {
    res.send('this is the login form');
})

.post(function(req, res, next) {
    console.log('processing');
    res.send('proccessing the login form!');
});

module.exports = router;

just writ module.exports = router then it will be work

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM