Как обновить страницу формы после POST-запроса? - PullRequest
0 голосов
/ 01 сентября 2018

Я работаю на одностраничном веб-сайте, используя Netbeans (HTML5 с Node.js и Express JS). Ниже приведен пример того, что мне нужно сделать (не настоящий веб-сайт).

У меня есть форма, когда я нажимаю кнопку отправить, мне нужно отправить данные в БД и обновить текущую страницу, которая имеет форму. Сейчас он отправляет данные в БД и отображает пустую страницу (выглядит как пустая страница в формате JSON. Мне нужно обновить, потому что я создаю API REST для отображения данных из той же БД на той же странице (index.pug).

В моем случае я использую Jage / Pug вместо файлов HTML

//index.pug
form(method='post', class="form-signin")
    input(type='text',class="form-control", name='fname')
    input(type='text',class="form-control", name='lname')
    button#button(type='submit', value='Submit') ADD

Вот app.js

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
const bodyParser = require("body-parser");
const pg = require('pg');
const config = {
user: 'postgres',
database: 'postgres',
    password: 'password',
    port: 5432,
    idleTimeoutMillis: 30000// (30 seconds) how long a client is allowed to remain idle before connection being closed
};
const pool = new pg.Pool(config);

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use(function(req, res, next){ //This is so I can use the pool in routes js files
        req.pool = pool;
        next();
    });

app.use('/', indexRouter);
app.use('/users', usersRouter);

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

// catch 404 and forward to error handler
app.use(function(req, res, next) {
   next(createError(404));
});


// error handler
app.use(function(err, req, res, next) {
   // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
 });

module.exports = app;

а вот маршруты / index.js

var express = require('express');
var router = express.Router();
const bodyParser = require("body-parser");

router.use(bodyParser.urlencoded({extended: true}));
router.use(bodyParser.json());

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
    });
//post to database
router.post("/",function (req, res, next) {
    // Grab data from http request
    var pool = req.pool;
    const data = {fname: req.body.fname, lname: req.body.lname};

 pool.connect(function (err, client, done) {
       if (err) {
           console.log("Can not connect to the DB" + err);
           res.status(400).send(err);
           }
           client.query('INSERT INTO public.names(fname, lname) values($1, $2)', [data.fname.toUpperCase(), data.lname.toUpperCase()],
              function (err, result) {
                done();
                if (err) {
                    console.log(err);
                    res.status(400).send(err);
                }
                res.status(200).send(result.rows);
                //res.redirect(req.get('referer'));
           });
        });
    });
//Create an API display all
router.get("/api/all", function (req, res, next) {
    var pool = req.pool;

    pool.connect(function (err, client, done) {
       if (err) {
           console.log("Can not connect to the DB" + err);
           res.status(400).send(err);
       }
       client.query('SELECT * FROM public.names', function (err, result) {
            done();
            if (err) {
                console.log(err.stack);
                res.status(400).send(err);
            }
            res.status(200).send(result.rows);
       });
    });
  });

module.exports = router;

Я пытался сделать это в jQuery:

$('#button').click(function() {
        location.reload(true);
    });

Это работает, но только когда я нажимаю на кнопку ДОБАВИТЬ, не имея никаких значений в полях ввода.

Можно ли перезагрузить страницу после POST-запроса? Здесь я что-то не так делаю?

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 01 сентября 2018

Поскольку ваша кнопка имеет тип submit, вам не нужно обрабатывать перезагрузку с помощью Javascript, потому что это поведение события отправки формы по умолчанию.

0 голосов
/ 01 сентября 2018

РЕДАКТИРОВАТЬ: В дополнение к form-submit, который раздает соединение и пустой DOM браузера. В дополнение к этому вы используете res.send(), который просто отправляет данные в браузер, и, поскольку в DOM нет JavaScript, чтобы позаботиться об ответе, ответ отображается без HTML.

Показать результат в html render, другой ejs с данными ответа.

router/index.js:

//post to database
router.post("/",function (req, res, next) {
  // Grab data from http request
  var pool = req.pool;
  const data = {fname: req.body.fname, lname: req.body.lname};

 pool.connect(function (err, client, done) {
   if (err) {
       console.log("Can not connect to the DB" + err);

       // This is how to display data with html
       res.render('error', {err});
       }
       client.query('INSERT INTO public.names(fname, lname) values($1, $2)', [data.fname.toUpperCase(), data.lname.toUpperCase()],
          function (err, result) {
            done();
            if (err) {
                console.log(err);

                // This is how to display data with html
                res.render('error', {err});
            }

            // This is how to display data with html
            res.render('desplayData', result.rows);
       });
    });
});

error.ejs:

    <!DOCTYPE html>
<html >
    <head>
        <meta charset="UTF-8">    
        <title>Error</title>
    </head>
    <body>
        <p><%=err%></p>
    </body>
</html>

displayData.ejs:

    <!DOCTYPE html>
<html >
    <head>
        <meta charset="UTF-8">    
        <title>Display Data</title>
    </head>
    <body>
        <p><%=rows%></p>
    </body>
</html>

Одностраничное приложение лучшего подхода с использованием javaScript Я не понимаю pug/jade, поэтому буду использовать html

index.html

<!DOCTYPE html>
<html >
    <head>
        <meta charset="UTF-8">    
        <title>Index</title>
    </head>
    <body>
        <input id="fName" type="text">
        <input id="lName" type="text">
        <p onclick="addInfo()">Submit</p>
        <!-- No need for `form` as will use JavaScript for Single Page Application -->

        <!-- This p tag will display response -->
        <p id="response"></p>

        <!-- This p tag will display error -->
        <p id="error"></p>
        <script type="text/javascript" src="/js/jquery.min.js"></script>
        <script>
             function addInfo() {
                // JavaScript uses `id` to fetch value
                let fName               = $("#fName").val(),
                    lName               = $("#lName").val();

                $.ajax({
                    "url": "/addDetail",
                    "method": "POST",
                    "data": {fName, lName}
                })
                .then( result => {
                    // On success empty all the input fields.
                    $("#fName").val('');
                    $("#lName").val('');
                    // Message to notify success submition
                    alert("Successfully added user.");

                    let newHTML = `<span>` + result + `</span>`;

                    $("#response").html(newHTML);

                    return;
                })
                .catch( err => {
                    // Notify in case some error occured
                    alert("An error occured.");

                    let newHTML = `<span>` + result + `</span>`;

                    $("#error").html(newHTML);

                    return;
                });
            }
        </script>
    </body>
</html>

router/index.js

//post to database
router.post("/addDetail",function (req, res, next) {
    // Grab data from http request
    var pool = req.pool;
    const data = {fname: req.body.fname, lname: req.body.lname};

     pool.connect(function (err, client, done) {
         if (err) {
             console.log("Can not connect to the DB" + err);
             res.status(400).send(err);
         }
         client.query('INSERT INTO public.names(fname, lname) values($1, $2)', [data.fname.toUpperCase(), data.lname.toUpperCase()],
            function (err, result) {
                done();
                if (err) {
                    console.log(err);
                    res.status(400).send(err);
                 }
                 res.status(200).send(result.rows);
                 //res.redirect(req.get('referer'));
            });
       });
 });

Причина, по которой вы видите пустую страницу с помощью json, заключается в том, что вы используете form submit, который не является одностраничным приложением . Чтобы придерживаться той же страницы и просто изменять html-контент, используйте любую инфраструктуру JavaScript для пользовательского интерфейса, такую ​​как AngularJs, ReactionJs, BackboneJs и т. Д.

Вы также можете использовать вызов AJAX, чтобы отправить данные и остаться на той же странице и отобразить свой ответ от API в том же HTML, скрыв и отобразив различные теги HTML.

Я дал похожие ответы в разных постах, тоже проверь все это:

  1. как отправить данные на html-страницу и как использовать ajax для одностраничного приложения
  2. как к рендер-а-HTML-страницы форм-nodejs-апи-когда запрошенная-через-Аякса
  3. как к извлекающих полей, из-запроса-в-узле-JS-используя-экспресс-основа
  4. как к рендер-а-HTML-страницы форм-nodejs-апи
0 голосов
/ 01 сентября 2018

Вы пытались добавить параметр действия в форму?

form(method='post', class="form-signin", action="/#")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...