Невозможно установить заголовки после их отправки во время записи файлов cookie - PullRequest
0 голосов
/ 24 августа 2018

Это код, который работает, проверяя, существуют ли входы, зарегистрированные кем-то на странице входа, в базе данных или нет. Работает и все. Однако, когда я хотел установить cookie (я просто хотел установить его случайным образом, чтобы посмотреть, работает ли он), чтобы я мог сохранить его состояние как онлайн, произошла ошибка

Cannot set Headers after they are sent

Я понимаю, что это потому, что я сделал res.render и res.cookies по одному и тому же запросу или что-то в этом роде, однако я удалил res.render и сохранил res.cookies, ошибка исчезла, но даже тогда это не не регистрировать файлы cookie (нет файлов cookie на сетевой панели инструментов dev или писать на консоли document.cookie)

Я также пытался переместить этот код в запрос get при рендеринге страницы, но он все еще не работает.

Это код сервера:

// Importing modules/packages
let connection = require("./Connection.js");
let bodyParser = require("body-parser");
var cookieParser = require("cookie-parser");
let express = require("express");
let app = express();
app.use(cookieParser());
let urlencodedParser = bodyParser.urlencoded({ extended: false });

// Server and routing
app.listen(3000, function() {
  console.log("The server at port 3000 is open!");
});
app.set("view engine", "ejs");
app.get("/Signup", (req, res) => {
  res.render("Register");
});
app.get("/", function(req, res) {
  res.redirect("Login");
});
app.get("/Login", function(req, res) {
  res.render("Login");
});

// Database's Connection
connection.connect(err => {
  if (err) {
    throw "ERROR! " + err;
  }
  console.log("Has connected to MySQL Database!");
});

// Requesting and Receiving Data from body parser
app.post("/Signup", urlencodedParser, function(req, res) {
  console.log(req.body);
  res.render("Register");
  connection.query(
    `insert into users (Username, User_Password, Email_Address) values ("${
      req.body.Username
    }", ${req.body.Password}, "${req.body.Email}")`,
    function(err) {
      if (err) throw "An error has happened while excuting the query " + err;
      console.log("Query got excuted successfully!");
    }
  );
});

app.post("/Login", urlencodedParser, (req, res) => {
  connection.query(
    `SELECT Username FROM users WHERE User_Password = ${
      req.body.Password
    } AND Username = "${req.body.Username}"`,
    function(err, results) {
      if (results.length === 0) {
        console.log(
          "Sorry, this username/password doesn't exist in our database."
        );
      } else {
        console.log("Logined successfully!");
        res.cookie("Friend", "Jack");
      }
    }
  );
  res.render("Login");
});

Я также пытался прочитать куки, используя req.cookie("Friend"), но это не сработало. Я не знаю, в чем проблема.

Как я могу решить эту проблему, пожалуйста?

1 Ответ

0 голосов
/ 24 августа 2018

Вы устанавливаете куки в обратном вызове, но рендеринг вне обратного вызова, это должно быть так:

app.post("/Login", urlencodedParser, (req, res) => {
  connection.query(
    `SELECT Username FROM users WHERE User_Password = ${
      req.body.Password
    } AND Username = "${req.body.Username}"`,
    function(err, results) {
      if (results.length === 0) {
        console.log(
          "Sorry, this username/password doesn't exist in our database."
        );
      } else {
        console.log("Logined successfully!");
        res.cookie("Friend", "Jack");
      }
      res.render("Login"); // <-- moved here
    }
  );
});

Код в Node.js обычно не выполняется последовательно - это из-за асинхронного характера (я написал кое-что еще об этом здесь ).

app.post("/path", (req, res) => {
  // 1
  connection.query(query, () => {
    // 3 after query has been executed
    res.cookie("Friend", "Jack");
  });
  // 2
  res.render("Login");
});

В вашем коде выполнение выглядит так:

  1. connection.query выполняется, но с учетом обратного вызова остальная часть кода не ждет завершения query, вместо этого он переходит к следующему оператору
  2. res.render("Login");, который будет отображать результат в браузере
  3. Запрос, наконец, выполняется, и результат возвращается к обратному вызову, где мы пытаемся установить res.cookie - который потерпит неудачу в этой точке.

Также обратите внимание, что ваш код содержит 1023 * уязвимости SQL-инъекций . Вы должны исправить это перед развертыванием в производство!

...