node.js / postgreSQL - Невозможно установить ошибку заголовков, несмотря на то, что перенаправление находится вне асинхронной функции - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь использовать переменную listID в строке response.redirect вне функции запроса.Это происходит из-за возврата идентификатора из запроса postgreSQL.listID продолжает возвращаться неопределенным, и я получаю сообщение об ошибке «[ERR_HTTP_HEADERS_SENT]: невозможно установить заголовки после их отправки клиенту».Я получаю то же самое, что не могу установить ошибку заголовков, если я перемещаю response.redirect внутри функции запроса.

Буду очень признателен, если кто-то конкретно укажет, что я ошибаюсь, и в идеале предоставит код, чтобы это исправить.Я новичок здесь - все еще нахожу свой путь вокруг понятий.Большое спасибо!

function formSubmit(request, response) {

// Start with an empty array of errors
const contextData = {
    title: 'Add listing',
    salutation: 'Please fill out the information below to post your item',
    errors: [],
};

if (request.method === 'POST') {
    const errors = [];

    if (!request.body.name || request.body.name.length > 101) {
        errors.push('Please fill out your name');
    }

    if (errors.length === 0) {

            // Add listing to listing SQL table
            var listingID;
            client.connect();
            client.query('INSERT INTO listings (name, email, school, gradyear, phone, object, price, image, firstavail, lastavail) values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING id;', [request.body.name, request.body.email, request.body.school, request.body.gradyear, request.body.phone, request.body.object, request.body.price, request.body.image, request.body.firstavail, request.body.lastavail], (err, res) => {
                if (err) throw err;
                var listingID = res.rows[0].id;
                client.end();
                console.log('some listing id: ',listingID);
                cb(listingID);
                // console.log(res.rows);
            });
            response.redirect(`/listing/${listingID}`);
    }
    contextData.errors = errors;
} else {
    console.log('This is a GET request');
}
return response.render('form', contextData);

}

1 Ответ

0 голосов
/ 25 декабря 2018

Если вы используете пакет pg, pg.connect устарела.Вместо этого вы должны использовать Pool, как описано в официальной документации pg : .

   const { Pool } = require('pg')    
   const pool = new Pool()    
   pool.query('SELECT * FROM users WHERE id = $1', [1], (err, res) => {
    if (err) {
    throw err
   }    
   console.log('user:', res.rows[0])
  })

. Вы можете проверить это дважды, выполнив журнал консоли после использования client.connect.Поможет простая строка, например «успешно подключено».

Не уверен насчет ошибки невозможности установить заголовки.Но посмотрите документацию для Экспресс-маршрутизация .Используя маршрутизаторы, вам не нужно проверять, является ли метод POST или GET.вместо этого у вас просто есть два разных маршрута:

router.get('/register',(req,res)=>{//your code}) //this get can be used to render registration apge that has the form



 router.post('/register',(req,res)=>{//form processing code}) //this post route is used to process the data submitted through the form

Маршрутизация не только упрощает написание кода, но и помогает при создании RESTFul apis. Также не используйте var.Вместо этого используйте let или const.Переменные 'let' могут быть переназначены, const - нет.

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