Express4.10 bodyParser req.body undefined

Estoy intentando generar el inicio de sesión de una aplicación de nodo tratando de acceder a la ruta / inicio de sesión get: req.body undefined

Error:

TypeError: Cannot read property 'usuario' of undefined at login (/home/makros/workspace/ntalk/controllers/home.js:8:24) at Layer.handle [as handle_request] (/home/makros/workspace/ntalk/node_modules/express/lib/router/layer.js:82:5) at next (/home/makros/workspace/ntalk/node_modules/express/lib/router/route.js:100:13) at Route.dispatch (/home/makros/workspace/ntalk/node_modules/express/lib/router/route.js:81:3) at Layer.handle [as handle_request] (/home/makros/workspace/ntalk/node_modules/express/lib/router/layer.js:82:5) at /home/makros/workspace/ntalk/node_modules/express/lib/router/index.js:235:24 at Function.proto.process_params (/home/makros/workspace/ntalk/node_modules/express/lib/router/index.js:313:12) at /home/makros/workspace/ntalk/node_modules/express/lib/router/index.js:229:12 at Function.match_layer (/home/makros/workspace/ntalk/node_modules/express/lib/router/index.js:296:3) at next (/home/makros/workspace/ntalk/node_modules/express/lib/router/index.js:190:10) 

app.js

 var express = require('express'), load = require('express-load'), cookieParser = require('cookie-parser'), session = require('express-session'), bodyParser = require('body-parser'), app = express(); load('models') .then('controllers') .then('routes') .into(app); app.set('views', __dirname + '/views'); app.set('view engine', 'ejs'); app.use(cookieParser('secret')); app.use(session({ secret: 'secret', resave: true, saveUninitialized: true })); app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json()); app.use(express.static(__dirname + '/public')); app.listen(3000,function(){ console.log('Started!'); }); 

paquete.json

 { "name": "ntalk", "version": "1.0.0", "private": true, "scripts": { "start": "node ./bin/www" }, "dependencies": { "body-parser": "^1.9.0", "cookie-parser": "^1.3.3", "ejs": "~0.8.5", "express": ">= 0.0.0", "express-load": "^1.1.14", "express-session": "^1.8.2" } } 

controladores / home.js

 module.exports = function(app) { return { index: function(req, res) { res.render('home/index'); }, login: function(req, res){ console.log(req.params); var email = req.body.usuario.email, nome = req.body.usuario.nome; if(email && nome) { var usuario = req.body.usuario; usuario['contatos'] = []; req.session.usuario = usuario; res.redirect('/contatos'); } else { res.redirect('/'); } }, logout: function(req, res){ req.session.destroy(); res.redirect('/'); } }; }; 

rutas / home.js

 module.exports = function(app) { var home = app.controllers.home; app.get('/', home.index); app.get ('/entrar', home.login); app.get('/sair', home.logout); }; 

vistas / inicio / index.ejs

  

Ntalk

Bem-vindo!



¡Por favor, ayúdame!

Estás agregando tus controladores de ruta a la app antes de que tu cuerpo analice el middleware. Todas las rutas / middleware / etc. Los agregados a la app se ejecutan en orden en Express 4.

Así que mueve esto:

 load('models') .then('controllers') .then('routes') .into(app); 

después de esta línea:

 app.use(express.static(__dirname + '/public')); 

En una nota no relacionada, normalmente debe colocar su uso express.static() cerca de la parte superior de su lista de rutas / middleware para mayor eficiencia. Esto evita la creación automática de sesiones y el análisis innecesario de cookies para solicitudes de activos estáticos, por ejemplo.

De hecho, el problema estaba en mi implementación de carga expresa, inyecta dependencias pero no configura la aplicación, así que decidí no usarla:

app.js

 var express = require('express'), path = require('path'), cookieParser = require('cookie-parser'), session = require('express-session'), bodyParser = require('body-parser'); var routes = require('./routes/home'), contacts = require('./routes/contacts'); var app = express(); app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(session({ secret: 'secret', resave: true, saveUninitialized: true })); app.use(express.static(path.join(__dirname, 'public'))); app.use('/', routes); app.use('/contatos', contacts); app.listen(3000,function(){ console.log('Started!'); }); 

rutas / home.js

 var router = require('express').Router(); var home = require('../controllers/home'); router.get('/', home.index); router.post('/entrar', home.login); router.get('/sair', home.logout); module.exports = router; 

controladores / home.js

 module.exports = { index: function(req, res) { /*do somethings*/ }, login: function(req, res){ /*do somethings*/ }, logout: function(req, res){ /*do somethings*/ } }; 

Debe haber una mejor manera de implementar el uso de express-load con express4, pero aún no se ha encontrado.

intenta mover

 app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json()); 

antes de

 load('models') .then('controllers') .then('routes') .into(app);