«Ошибка [ERR_HTTP_HEADERS_SENT]: невозможно установить заголовки после их отправки клиенту» - PullRequest
0 голосов
/ 19 апреля 2020

Вот мой индекс. js код

var express = require("express");
var mysql = require('mysql');
var pug = require('pug');
var bodyparser = require('body-parser');
var app = express();

var conn = mysql.createConnection({
    host: "remotemysql.com",
    user: "",
    password: "",
    database: ""
});

conn.connect(function(err) {
    if (err) {
        console.log("Error connecting to MySQL:", err);
    } else {
        console.log("Connection established");
    }
});

let people = [];
let i = 0;

let subname = null;
let subemail = null;
let subsession = null;

app.set("views", "views");
app.set("view engine", "pug");
app.use(express.static("public"));
app.use(bodyparser());

app.get("/", function(req, res, next) {
    res.render("confirmed");
});

app.post("/register", function(req, res, next) {

    var attendees = {
        name: req.body.name,
        email: req.body.email,
        session: req.body.selectpicker
    };
    conn.query("INSERT INTO attendees SET ?", attendees, function(err, result, ) {
        if (err)
            res.send(err);
        else
            res.send("Thank You for registering!");
    });

    if (i = 0) {
        people.pop();
    }

    subname = req.body.name;
    subemail = req.body.email;
    subsession = req.body.session;

    let locals = {
        name: subname,
        email: subemail,
        session: subsession
    };
    people.push(subname + "," + subemail + "," + subsession);

    console.log(locals);
    console.log(subname);
    console.log(subemail);
    console.log(subsession);
    console.log("People: " + people);

    res.render("confirmed", locals);
});

//app.post("/register", function(req, res) {
//});

app.get("/list", function(req, res, next) {
    let peoplelist = {
        attendeelist: people
    }
    res.render("list", peoplelist);
});

app.listen(3000);

Я получаю сообщение об ошибке Ошибка [ERR_HTTP_HEADERS_SENT]: Невозможно установить заголовки после их отправки клиенту на ServerResponse.setHeader (_http_outgoing. js: 526: 11) в ServerResponse.header (/home/runner/M18-CloudSecConf-with-DB/node_modules/express/lib/response.js:771:10)

что мне нужно изменить, переместить или добавить, чтобы получить это на go прочь. Я немного понимаю, что он пытается отправить данные на сервер, а затем не может установить заголовки, но я не уверен, что делать. Пожалуйста, помогите, пытаясь выучить этот материал.

1 Ответ

0 голосов
/ 19 апреля 2020

Ваш обработчик маршрута /register имеет res.send() внутри обратного вызова базы данных, а также res.render() в конце обработчика маршрута. Каждый из них пытается отправить запрос на входящий HTTP-запрос. Но вы можете отправлять только ОДИН HTTP-ответ на каждый http-запрос.

Express замечает эту проблему в самом начале второй попытки отправить ответ и замечает ее, когда пытается собрать заголовки в отправить для второго ответа, и он видит, что заголовки уже отправлены, таким образом, сообщение, которое вы получаете.

Итак, вам нужно удалить либо res.send() или res.render(), либо как-то объединить их в один ответ.

Соответствующий обработчик маршрута:

app.post("/register", function(req, res, next) {

    var attendees = {
        name: req.body.name,
        email: req.body.email,
        session: req.body.selectpicker
    };
    conn.query("INSERT INTO attendees SET ?", attendees, function(err, result, ) {
        // ATTEMPT #1 to send a response
        if (err)
            res.send(err);
        else
            res.send("Thank You for registering!");
    });

    if (i = 0) {
        people.pop();
    }

    subname = req.body.name;
    subemail = req.body.email;
    subsession = req.body.session;

    let locals = {
        name: subname,
        email: subemail,
        session: subsession
    };
    people.push(subname + "," + subemail + "," + subsession);

    console.log(locals);
    console.log(subname);
    console.log(subemail);
    console.log(subsession);
    console.log("People: " + people);

    // ATTEMPT #2 to send a response
    res.render("confirmed", locals);
});

К вашему сведению, ваш оператор if:

    if (i = 0) {

неверен. Это присваивает 0 i, а затем делает if в результате присваивания, которое не является тем, что вы хотите. Правильный оператор if будет выглядеть так:

    if (i === 0) {

Также неясно, что вы пытаетесь сделать с общепринятой переменной уровня модуля, такой как i, которая является общей для всех пользователей и всех запросов. Вероятно, это также неправильный дизайн.

Аналогично, переменные типа subname, subemail, subsession должны объявляться локально внутри вашего обработчика маршрута, а не на уровне модуля.

Помните, что любая переменная, объявленная вне обработчика маршрута, является осколочной для всех пользователей и всех маршрутов, и это не то, чего вы обычно хотите, за исключением длительного состояния, которое совместно используется всеми пользователями и всеми маршрутами на сервере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...