Express4.10 bodyParser req.body未定义 [英] Express4.10 bodyParser req.body undefined

查看:90
本文介绍了Express4.10 bodyParser req.body未定义的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试构建试图访问路由/登录名的节点应用程序的登录名:req.body undefined

错误:

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!');
});

package.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"
  }
}

controllers/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('/');
        }
    };
};

routes/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);
};

views/home/index.ejs

<% include ../header %>
        <header>
            <h1>Ntalk</h1>
            <h4>Bem-vindo!</h4>
        </header>
        <section>
            <form action="/entrar" method="post">
                <input type="text" name="usuario[nome]" placeholder="Seu nome">
                <br>
                <input type="text" name="usuario[email]" placeholder="Seu e-mail">
                <br>
                <button type="submit">Entrar</button>
            </form>
        </section>
<% include ../footer %>

请帮助我!

解决方案

事实上,问题出在我的express-load实现中,它注入依赖项但未配置应用程序,因此我决定不使用它:

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!');
});

routes/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;

controllers/home.js

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

必须有一个更好的方法来将express-load与express4一起使用,但尚未找到.

I'm trying to build the login of a node application trying to access the route / login 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!');
});

package.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"
  }
}

controllers/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('/');
        }
    };
};

routes/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);
};

views/home/index.ejs

<% include ../header %>
        <header>
            <h1>Ntalk</h1>
            <h4>Bem-vindo!</h4>
        </header>
        <section>
            <form action="/entrar" method="post">
                <input type="text" name="usuario[nome]" placeholder="Seu nome">
                <br>
                <input type="text" name="usuario[email]" placeholder="Seu e-mail">
                <br>
                <button type="submit">Entrar</button>
            </form>
        </section>
<% include ../footer %>

Please help me!

解决方案

In fact the problem was in my implementation of express-load, it injects dependencies but does not configure the app, so I decided not to use it:

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!');
});

routes/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;

controllers/home.js

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

There must be a better way to implement using express-load with express4, but not yet found.

这篇关于Express4.10 bodyParser req.body未定义的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆