Проблемы перенаправления/маршрутизации в React и Express

Я создаю приложение для поиска рейсов, которое делает внешние вызовы API. Данные будут реорганизованы и возвращены в компонент результатов поиска.

При отправке данные отправляются в экспресс, и для завершения всех вызовов API требуется около 10 секунд или более.

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

В нынешнем виде у меня есть две страницы: home.js- '/', где я выполняю поиск и отправка на сервер, и price.js- '/search', которая при загрузке извлекает данные из файла json. а у меня они не подключены

Оба файла работают, но мне нужно их подключить. Когда я нажимаю «Отправить», пользовательские данные отправляются на сервер и выполняются вызовы API, но для того, чтобы увидеть результаты, мне нужно вручную обновить localhost: 3000/search.

В экспресс-приложении после всех вызовов API я попробовал метод res.redirect, однако выданная ошибка заключалась в установке заголовков после отправки клиенту.

В ответ я попытался после отправки перенаправить на страницу поиска. Однако я не смог заставить его перенаправить, а также, как только вызывается страница /search, она извлекает данные из файла. Это произойдет до того, как API завершит запись в файл, и поэтому будут отображены предыдущие результаты поиска.

--in app.js 
setTimeout(() => {
        Promise.all([promise, promise2]).then(values => {

            return res.redirect('http://localhost:3000/search');

        });
    }, 25000);

I had to wrap the api calls in promises so it will only redirect after all is written to file. 

(в реагирующих ценах.js)

 componentDidMount() {

   fetch('/search')
            .then(res => {

                return res.json()

            })
            .then(res => {

                console.log(res.toString());


                this.setState({flightData: res});

            })
            .catch(error => console.log(error));
    }

home.js

home.js

```
onChange = (e) => {
    this.setState({
       originOne: e.target.value, originTwo: e.target.value});
    };


 onSubmit = (e) => {
     e.preventDefault();

     const { originOne, originTwo ,redirectToResult} = this.state;


};


```
app.js - I have all the functions calling each other in a waterfall style ( probably not the best way I know) 

app.post('/', function getOrigins(req,res) {

     var OrigOne;
     var OrigTwo;

....

function IataCodeSearchOrg1(res, OrigOne, OrigTwo) {
... 
findPrices(res,A,B)
}

 function findPrices(res, A, B) {

         promise = new Promise(function (resolve) {
...
}
}

All the methods are called within eachother. The api calls are in a loop and after each iteration they are written to the json file. 

All these functions are in the app.post method and i tried to res.redirect but it did not work.  


person AnnaM    schedule 01.04.2019    source источник
comment
Можете ли вы поделиться остальной частью соответствующего кода сервера? Часть из app.js кажется неполной   -  person djfdev    schedule 02.04.2019


Ответы (1)


РЕДАКТИРОВАТЬ:

Вы не можете перенаправить серверную часть запроса XHR. Вам нужно будет перенаправить клиентскую сторону.

e.g.

componentDidMount() {

   fetch('/search')
       .then(res => res.json())
       ...
       .then(() => window.location = '/myredirecturl')
} 
person jsdeveloper    schedule 01.04.2019
comment
Спасибо за ваш ответ, у меня есть рендеринг данных на странице цен в порядке, но я не могу перенаправить на страницу цен после того, как вызовы API выполняются в экспресс-режиме. Хотя я, возможно, делаю это неправильно, должен ли я перенаправлять на серверную или клиентскую страницу со страницей цен? - person AnnaM; 02.04.2019