Как обновить избыточное хранилище запрошенными данными из экспресс-сервера с помощью pg-promises - PullRequest
0 голосов
/ 30 апреля 2019

Разработчик проекта, над которым я работаю слева, только частично завершил интерфейс и бэкэнд, и теперь я пытаюсь подключить серверную часть Node / Express к интерфейсу React / Redux в время окончания проекта.

В приложении имеется ряд раскрывающихся списков со значением категории (т. Е. Медицинское обслуживание, консультирование и т. Д.), И после того, как все они выбраны и отправлены, в базу данных Postgres запрашиваются указанные входные данные для возврата всех соответствующих результатов. удовлетворение критериев пользователей в серии карточек для пользователя.

Основная проблема, которую я оставил (которую я определил с помощью инструментов Redux dev), заключается в том, что, хотя запрос проходит успешно, действие не обновляет свойство data в состоянии (которое должно содержать массив запрашиваемых сервисов). ).

Я включил код для редуктора, который обновляет состояние, а также соответствующий запрос в файле back-end server.js.

Reducer.js

const leftSidebarReducer = (state = initialState, action ) => {
    async function categoryQuery(json)
        await fetch('/category_query', { //post request in Server.js
            method: 'POST',
            headers: {
                "Content-Type": "application/json",
            },
            body: json //currently returns the user inputs
        })
        .then(function(response){
            return response.json(); //**Data I want in store here**
        })
        .catch(err => console.log(err));
    }

//--- Further down in the Reducer:  ---//

case actionTypes.QUERY_DB:
   var newdata = [];
   var testStr = JSON.stringify({
      cat: state.leftMenu.catDrop,
      subCat: state.leftMenu.subCatDrop,
      insCat: state.leftMenu.insDrop,
      langCat: state.leftMenu.langDrop,
    }); 
    categoryQuery(testStr) //Run the async function above with state values
    return {
       ...state,
       data: newdata //Where the data should be updating ***
    }

Server.js

app.post('/category_query', (req, res) => { //this is the main category query
  console.log(req); //this is an attempt to see if we receive the reqs
  db.any(
  `SELECT * FROM med_services
      WHERE cat_name = $1 AND subCat = $2 AND insurance = $3`
      ,['Medical Care', 'clinic', 'blue-cross']
       //normally would be [req.body.cat, req.body.subCat, req.body.insCat]
   )
    .then(data => {
        console.log('DATA:', data); // print data;
        res.send(data);
        console.log('category query sent successfully')
    })
    .catch(error => {
        res.send('Error processing query');
    })
});

Основная проблема здесь заключается в том, что когда редуктор устанавливает data: newData, я вместо этого получаю пустой массив (т.е. data: []) вместо массива значений из базы данных.

Другая проблема на самом деле заключается в передаче тела запроса в pg-обещание (для которого я сейчас использую только введенные в строку значения для проверки). WHERE cat_name = $1 AND subCat = $2 AND insurance = $3`,['Medical Care', 'clinic', 'blue-cross'] Однако при попытке [req.body.cat и т. Д.] Я не могу прочитать свойство body из undefined.

1 Ответ

1 голос
/ 30 апреля 2019

Основная проблема заключается в том, что когда редуктор устанавливает данные: newData, я вместо этого получаю пустой массив (т.е. данные: []) вместо массива значений из базы данных.

Вы должны регистрировать фактический выполняемый запрос, чтобы увидеть, что выполняется, и почему данные не возвращаются. Для этого либо используйте опцию инициализации query , либо перейдите прямо к pg-monitor .

Другая проблема на самом деле заключается в передаче тела запроса в pg-обещание (для которого я сейчас использую только набранные строковые значения для проверки). ГДЕ cat_name = $ 1 И subCat = $ 2 И страховка = $ 3`, [«Медицинское обслуживание», «Клиника», «Голубой крест»]

Лучше использовать pg-promise форматирование запроса с Именованные параметры :

db.any(
  `SELECT * FROM med_services
      WHERE cat_name = $/cat/ AND subCat = $/subCat/ AND insurance = $/insCat/`, req.body)
    .then(data => {...}

Однако при попытке [req.body.cat и т. Д.] Я не могу прочитать свойство body из undefined.

Это говорит о том, что ваш req равен undefined, так или иначе, и попытка получить доступ к свойству body из undefined выдает такую ​​ошибку.

...