ERR_HTTP_HEADERS_SENT - Express: заголовки не могут быть установлены после отправки клиенту, как я могу решить эту ошибку? - PullRequest
0 голосов
/ 29 января 2020

Я пробовал много разных решений на стеке потока по этому поводу, но. Но они не работали.

Возникает эта ошибка:

Ошибка [ERR_HTTP_HEADERS_SENT]: Невозможно установить заголовки после того, как они отправлены клиенту на ServerResponse.setHeader (_http_outgoing. js: 485: 11) в ServerResponse.header (/mnt/c/Users/Lucas-PC/Desktop/OnlineChat/node_modules/express/lib/response.js:771:10) в ServerResponse.location (/ mnt /c/Users/Lucas-PC/Desktop/OnlineChat/node_modules/express/lib/response.js:888:15) в ServerResponse.redirect (/ mnt / c / Users / Lucas-PC / Desktop / OnlineChat / node_modules) /express/lib/response.js:926:18) в заявлении. (/mnt/c/Users/Lucas-PC/Desktop/OnlineChat/app.js:135:28) -> в базе данных # каждый ("ВЫБРАТЬ * ОТ пользователей, ГДЕ электронная почта = 'yyyy@yyyy'", [ Функция]) в /mnt/c/Users/Lucas-PC/Desktop/OnlineChat/app.js:133:16 в Layer.handle [как handle_request] (/ mnt / c / Users / Lucas-PC / Desktop / OnlineChat / node_modules / express / lib / router / layer. js: 95: 5) в следующем (/mnt/c/Users/Lucas-PC/Desktop/OnlineChat/node_modules/express/lib/router/route.js: 137: 13) в Route.dispatch (/mnt/c/Users/Lucas-PC/Desktop/OnlineChat/node_modules/express/lib/router/route.js:112:3) в Layer.handle [as handle_request] (/mnt/c/Users/Lucas-PC/Desktop/OnlineChat/node_modules/express/lib/router/layer.js:95:5) в / mnt / c / Пользователи / Lucas-PC / Desktop / OnlineChat / node_modules / express / lib / router / index. js: 281: 22 по адресу Function.process_params (/mnt/c/Users/Lucas-PC/Desktop/OnlineChat/node_modules/express/lib/router/index.js: 335: 12) в следующем (/mnt/c/Users/Lucas-PC/Desktop/OnlineChat/node_modules/express/lib/router/index.js:275:10) в / мин t / c / Пользователи / Lucas-PC / Рабочий стол / Онлайн-чат / приложение. js: 70: 5 {code: 'ERR_HTTP_HEADERS_SENT', __augmented: true}

Вот мой код:


const redirectLogin = (req, res, next) => {
    if (!req.session.userId){
        res.redirect('/login');
    }else {
        next();
    }
}

const redirectHome = (req, res, next) => {
    if (req.session.userId){
        res.redirect('/dashboard');
    }else {
        next();
    }
}

app.post('/login', redirectHome, (req, res) => {
    reloadUsers(users);
    const { email, password } = req.body;
    if (email && password) {
        const user = users.find(user => user.email === email && user.password === password) // TODO: hash password
        if (user){
            console.log(user.id);
            req.session.userId = user.id;
            res.redirect('/dashboard');
            return;
        }
    }
    res.redirect('/')
})


app.post('/register', redirectHome, (req, res) => {
    const { name, job, email, password } = req.body;

    if (name && job && email && password){ // TODO: validation more complex
        const exists = users.some(user => user.name === name && user.email === email);

        if(!exists){
            let infos = [name, email, job, password];
            let placeholders = infos.map((info) => '?').join(',');
            let sql = 'INSERT INTO users(name, email, job, password) VALUES('+ placeholders +')';
            db.run(sql, infos);
            console.log('email: '+req.body.email);
            db.each("SELECT * FROM users WHERE email='"+req.body.email+"'", (err, row) => {
                req.session.userId = row.id;
            })
            return res.redirect('/dashboard');
        }
    }

    res.redirect('/');
})

app.post('/logout', redirectLogin, (req, res) => {
    reloadUsers(users);
    req.session.destroy(err => {
        if (err){
            return res.redirect('/dashboard');
        }
        res.clearCookie(SESS_NAME);
        res.redirect('/login');
    });
})

Я думаю, что ошибка происходит от app.post('/login') и app.post('/register') на res.redirect('/dashboard')

1 Ответ

0 голосов
/ 30 января 2020

Под вашим /register роутером вы пытаетесь установить запрос после отправки ответа.

db.each("SELECT * FROM users WHERE email='"+req.body.email+"'", (err, row) => {
    req.session.userId = row.id;
})
return res.redirect('/dashboard');

db.each() - это асинхронная функция, поэтому вам придется обрабатывать ответ внутри функции.

db.each("SELECT * FROM users WHERE email='"+req.body.email+"'", (err, row) => {
    req.session.userId = row.id;
    return res.redirect('/dashboard');
})

НЕКОТОРЫЕ СОВЕТЫ: ​​Также старайтесь избегать ваших строк, когда вы создаете операторы SQL, чтобы избежать инъекций SQL.

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