запрос node-postgres не запускается при перенаправлении на домашнюю страницу после регистрации пользователя - PullRequest
0 голосов
/ 20 июня 2019

Я создаю очень простой аутентифицированный веб-сайт для обучения, дающий пользователям возможность создать учетную запись, войти в систему и просматривать контент.

Проблема заключается в том, что зарегистрированные пользователи не видят на домашней странице (в качестве теста) после успешной регистрации. После публикации я перенаправляю пользователя обратно на домашнюю страницу, и маршрут get запускает функцию postgres, используя модуль node-postgres, чтобы получить всех пользователей в базе данных и вернуть их. Это не похоже на увольнение. Тем не менее, когда я запускаю ту же функцию в своей базе данных, я вижу нового пользователя.

Что странно, так это то, что когда я нажимаю Enter на домашнем маршруте в браузере, появляется новый пользователь. Так что я действительно не уверен, что это кеширование или неправильное понимание обещаний (я только начал вникать в это) или что-то еще.

Я попытался использовать обратные вызовы вместо обещаний, как показано здесь: https://node -postgres.com / features / query , чтобы увидеть, если это что-то меняет. Кроме этого, я добавил записи в журнал, чтобы увидеть, действительно ли обещание разрешается или отклоняется. Но, похоже, это всегда решает, поэтому я действительно не уверен, что здесь происходит.

<!-- register.ejs -->
<%- include('partials/header') %>
<div class="container mt-5">
  <h1>Register</h1>

  <div class="row">
    <div class="col-sm-8">
      <div class="card">
        <div class="card-body">

          <!-- Makes POST request to /register route -->
          <form action="/register" method="POST">
            <div class="form-group">
              <label for="email">Email</label>
              <input type="email" class="form-control" name="username">
            </div>
            <div class="form-group">
              <label for="password">Password</label>
              <input type="password" class="form-control" name="password">
            </div>
            <button type="submit" class="btn btn-dark">Register</button>
          </form>

        </div>
      </div>
    </div>
  </div>
</div>
<%- include('partials/header') %>
\\index.js (in ./db)
const {
    Pool
} = require('pg');

const pool = new Pool({
    database: 'secrets'
});


module.exports = {
    query: (text, params, callback) => {
        return pool.query(text, params, callback)
    }
};
//jshint esversion:6

/* Imports
 * ================================================================================ */
const express = require('express');
const bodyParser = require('body-parser');
const db = require('./db');
const util = require('util');

/* App setup
 * ================================================================================ */
const app = express();
app.disable('etag');
const port = 3000;

app.use(express.static(util.format("%s/%s", __dirname, 'public')));
app.set('view engine', 'ejs');
app.use(bodyParser.urlencoded({
    extended: true
}));

/* Routes
 * ================================================================================ */

// Get request 
app.get("/", function (req, res, next) {
    db.query('SELECT * FROM dbo.usp_SelectUsers()')
        .then(function(dbResult) {
            console.log(dbResult.rows);
            res.send(dbResult.rows);
        }, (reason) => {
            console.log("Not fulfilled :(");
        }).catch(_err => next(_err));
});

// Post request for registration
app.post("/register", function (req, res, next) {
    const queryText = 'SELECT dbo.usp_CreateUser($1, $2)';
    const queryValues = [req.body.username, req.body.password];
    db.query(queryText, queryValues)
        .then(res.redirect("/"))
        .catch(err => next(err))
});
CREATE OR REPLACE FUNCTION dbo.usp_SelectUsers()
  RETURNS TABLE (User_ID INTEGER, User_Name VARCHAR(100)) AS
$func$
BEGIN
    RETURN QUERY
    SELECT u.User_ID
        ,u.User_Name
    FROM dbo.User u
    ;
END
$func$  LANGUAGE plpgsql;

Ожидаемый результат - видеть новых пользователей в базе данных и отображаться на домашней странице ("/") после успешной публикации без необходимости повторного обновления страницы.

1 Ответ

0 голосов
/ 21 июня 2019

Я обновил свой регистрационный код, чтобы использовать async / await следующим образом, и это исправило все для меня. Я понял, что проблема, с которой я столкнулся ранее, заключается в том, что сообщение не было полностью завершено до того, как был выполнен вызов базы данных для получения списка пользователей (т. Е. В базе данных еще не было нового пользователя при вызове dbo.usp_SelectUsers).

app.post("/register", async (req, res, next) => {
    try {
        const queryText = 'SELECT dbo.usp_CreateUser($1, $2)';
        const queryValues = [req.body.username, req.body.password];
        const results = await db.query(queryText, queryValues);
        res.redirect("/login");
    } catch (err) {
        throw err;
    }
});

В качестве примечания я прочитал, что async / await также намного лучше использовать в наше время, и это исправление добавлено в плюсы. Пожалуйста, смотрите следующую статью для справки: https://hackernoon.com/6-reasons-why-javascripts-async-await-blows-promises-away-tutorial-c7ec10518dd9

...