nanquim
nanquim

Reputation: 1924

Express - POST request pending

I have a form to register users, but post request is not working

I've checked bodyparser, consign includes order, added enctype to form and still do not work

The route is working, cause it calls my controller, but as you can see at console image, it goes to the controller with undefined req, althought url params are defined at devtools

server.js:

const express = require('express'); 
const consign = require('consign');
const bodyParser = require('body-parser');
const expressValidator = require('express-validator');
const helmet = require('helmet');
const jwt = require('jsonwebtoken');
require('dotenv-safe').load();  

const app = express(); 
app.set('view engine', 'ejs');
app.set('views', './app/paginas'); 

app.use(express.static('./app/publico/'));
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
app.use(expressValidator());

consign(/* {cwd: 'app'} */)
    .include('config/conectarBD.js')
    .then('app/modelos')
    .then('app/controles')
    .then('app/rotas')
    .into(app);


/* consign()
    .include('app/rotas')
    .then('config/conectarBD.js')
    .then('app/modelos')
    .then('app/controles')
    .into(app); */

console.log('Instância do app criada');

module.exports = app;

form.ejs:

<div class="row" id="form_registro">
                <div class="col-sm-6 offset-sm-3 text-center">
                        <form action="/registrar" method="POST">
                        <fieldset>
                            <legend>Registro</legend>
                            <div class="form-group">
                                <label for="form-r-email">Nome:</label>
                                <input type="text" class="form-control" id="nome" name="nome" placeholder="Seu nome">
                            </div>
                            <div class="form-group">
                                <label for="form-r-email">Email:</label>
                                <input type="email" class="form-control" id="email" name="email"
                                    placeholder="Seu email">
                            </div>
                            <div class="form-group">
                                <label for="form-r-senha">Senha:</label>
                                <input type="password" class="form-control" id="senha" name="senha"
                                    placeholder="Sua senha">
                            </div>
                            <!-- TODO implementar -->
                            <div class="form-check">
                                <input type="checkbox" class="form-check-input" id="exampleCheck2">
                                <label class="form-check-label" for="exampleCheck1">Lembre de mim</label>
                            </div>
                            <button type="submit" class="btn btn-success">Registrar</button>
                        </fieldset>
                        <div>
                            Já tem uma conta?
                            <a href="#" id="logar">Registrar!</a>
                        </div>
                    </form>
                </div>
            </div>

route login.js:

module.exports = function(application) {
    application.get('/login', function(req, res) {
        console.log('Rota pegaPaginaLogin');
        application.app.controles.login.pegaPaginaLogin(application, req, res);
    });
    application.post('/admin/logar', function(req, res) {
        console.log('Rota /admin/logar');
        application.app.controles.login.logaUsuario(application, req, res);
    });

    application.post('/registrar', function(req, res) {
        console.log('Rota registrar');
        console.log('req.body >>>' + req.body);
        res.status(500).send('testing');
        application.app.controles.login.registraUsuario(application, req, res);
    });
}

controller registraUsuario:

module.exports.registraUsuario = function (application, req, res) {
    console.log('Controller registraUsuario');
    console.log('REQ....' + req)
    var usuario = req.body;

    /** Validação do formulário */
    //TODO validar formatos
    req.assert('nome', 'Nome é obrigatório').notEmpty();
    req.assert('email', 'Email é obrigatório').notEmpty();
    req.assert('senha', 'Senha é obrigatório').notEmpty();

    var errosValidacao = req.validationErrors();

    console.log(errosValidacao);

    if (errosValidacao) {
        res.render('login', {
            validacao: errosValidacao,
            usuario: usuario
        });
        return;
    }

    /** Conexão com banco */
    var conexao = application.config.conectarBD();
    var novoUsuario = new application.app.modelos.UsuariosModel(conexao);

    novoUsuario.getUsuario(usuario, function (error, result) {
        console.log(result);

        novoUsuario.novoUsuario(usuario);
    });

}

model UsuariosModel:

function UsuariosModel(conexao) {
    this._conexao = conexao;
}

/** Se usuário existir, retorna a id_usuario */
UsuariosModel.prototype.getUsuario = function (usuario, callback) {
console.log('Model getUsuario');
this._conexao.query('SELECT id_usuario FROM usuarios WHERE email = "' + usuario.email + ' and senha = "' + usuario.senha + '"');

}

UsuariosModel.prototype.novoUsuario = function (usuario, callback) {
    var hoje = Date.now();
    this._conexao.query('INSERT INTO usuarios SET ?', usuario, callback);
}

module.exports = function () {
    return UsuariosModel;
};

console:

enter image description here

error:

enter image description here

enter image description here

Upvotes: 2

Views: 7459

Answers (2)

Rohit Sunil Nale
Rohit Sunil Nale

Reputation: 11

Close your database connection I will facing same issues once you close db connection the issue will be solved

Try {
  ...
} Catch {
  ...
} finally {
  Connection.close()
}

Upvotes: 1

Steven Spungin
Steven Spungin

Reputation: 29109

Your server code is not calling response.send.

Replace your code with this to test:

application.post('/registrar', function(req, res) {
        console.log('Rota registrar');
        console.log('REQ.query....' + req.params.name);
        res.status(500).send('testing');
        //application.app.controles.login.registraUsuario(application, req, res);
    });

In registraUsuario, you need to call send with your response/status code. Yourclient will block until send is called, or a timeout occurs.

Upvotes: 5

Related Questions