В базу данных не сохраняется boolean при работе с pg-npm

Рейтинг: 0Ответов: 1Опубликовано: 27.06.2023

Создал метод:

    async changePerson(id, name, surname, isEmployee) {

        let updateObj = {};

        if (name) {
          updateObj.name = name;
        }
        
        if (surname) {
          updateObj.surname = surname;
        }
    
        if(isEmployee) {
            updateObj.is_employee = isEmployee;
        }

        const text = "UPDATE person SET name = $1, surname = $2, is_employee = $3 WHERE id = $4"
        const values = [updateObj.name, updateObj.surname, updateObj.isEmployee, id];

        return await client.query(text, values);

    }

Дергаю его через роут:

router.patch('/changePerson/id/:id', bodyParser.json(), async (req, res) => {

    const { id } = req.params;
    const isEmployee = req.body.is_employee
    const { name, surname } = req.body
    
    try {
        person = (await new methods().getPerson(id)).rows[0]
            if (person) {
                try {
                    await new methods().changePerson(id, name, surname, isEmployee)
                    res.sendStatus(200)
                } catch (error) {
                    res.sendStatus(500)
                }
            } else {
                res.sendStatus(404);
            }
    } catch (error) {
        res.sendStatus(500);
    }
})

Все значения в БД (name\surname) меняются на новые, а вот is_employee/isEmployee (в БД/коде соответственно) всегда получается null. Причем перед сохранением в массив values я вывожу его в консоль и вижу пережданное значение, но селект на всех юзров:

const text = "SELECT * FROM person";
return (await client.query(text)).rows

всегда отдает "is_employee": null

Ответы

▲ 2Принят

У вас тут две ошибки.

if (isEmployee) {
  updateObj.is_employee = isEmployee;
}

const text = "UPDATE person SET name = $1, surname = $2, is_employee = $3 WHERE id = $4"
const values = [
  updateObj.name,
  updateObj.surname,
  updateObj.isEmployee,
  id
]
  1. в updateObj кладётся is_employee, а в values подставляется updateObj.isEmployee.

  2. if (isEmployee) { будет работать не так, как вы предполагаете (false не попадёт в updateObj). Нужно написать что-то вроде updateObj.is_employee = (isEmployee === true);