Форма React не загружается с сервера Express

У меня есть экспресс-бэкэнд, который делает запрос GET к API OpenWeather, когда запрос POST выполняется из формы React. В настоящее время проблема заключается в внутреннем маршруте POST, который, как я полагаю, некорректно вызывает и не может сохранить поисковый запрос. Когда я занимался отладкой, я сделал запрос на выборку из внешнего интерфейса, который работает, и я также поместил фиктивный массив, хранящийся в экспрессе, используя тот же маршрут, который не работает и который можно получить как с передней, так и с внутренней стороны.

На вкладке сети не отображаются запросы POST, только запросы GET с ответом 304, но в консоли я получаю «cod:« 400 », сообщение:« плохой запрос », которое, как я предполагаю, является сообщением об ошибке из API OpenWeather.

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

const WeatherContainer = () => {
    let [searchTerm, setsearchTerm] = useState('')
    let [currentWeather, setCurrentWeather] = useState({});
    let [forecastedWeather, setForecastedWeather] = useState({});
    let [loading, setLoading] = useState(false); 
    
    const handleInput = (e) => {
        setsearchTerm(e.target.value);
    }

    const handleSearch = () => {
        fetch('/search-weather')
            .then(res => res.json())
            .then(data => {
                    setCurrentWeather({data})
                    console.info(data)
               })
    };
    

    return (
        <>
            <div className='search-bar'>
                <form method = "POST" action='/search-term'>
                    <input className='text_input' type='text' name='searchTerm' onChange = {handleInput} placeholder='Enter city' />
                    <button className='search-button' onClick = {handleSearch} type='submit' value='submit' name='button'>
                        <Icon icon = {searchIcon} flip = "horizontal" />
                    </button>
                </form>
            </div>
            {}
            <div className='weather_container'>
                <CurrentWeatherComponent />
                <ForecastContainer />
            </div>
        </>
    )

};

ЭКСПРЕСС-КОД

const express = require('express');
const PORT = 5000;
const fetch = require('node-fetch')
const app = express();
//const server = require('http').createServer(app);
const weatherApiKey = '****HIDDEN****';
const cors = require('cors');

app.use(express.static("client"));
app.use(cors());
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

let searchTerm;

// Post From Input, Route uses 'searchTerm' name attribute in input
app.post('/search-term', (req, res) => {
    searchTerm = req.body.searchTerm;
    
});

// GET Current & Forecast Weather By Search Term
app.get('/search-weather', (req, res) => {

    const currentUrl = `http://api.openweathermap.org/data/2.5/weather?q=${searchTerm}&units=imperial&appid=${weatherApiKey}`;

    fetch(currentUrl)
        .then(response => response.json())
        .then(currentData => {
            return res.json({currentData})
        })
        .catch(err => { 
            res.redirect('/error')
    });  
}); 


app.listen(PORT); 
console.info(`Server is listening on ${PORT}`);
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
35
2

Ответы 2

Вероятно, в теле обратного вызова Search Weather "$ {searchTerm}" не определено. Итак, вы установили параметр «q» как «undefined», поэтому у вас плохой запрос.

Я проверил это для себя с помощью тестового токена и тоже получил (для пустых условий). Вот За работой и Плохой запрос

searchTerm объявлен глобально над маршрутом POST, так что будет ли это означать, что мой почтовый маршрут не публикуется, и поэтому поисковый запрос никогда не сохраняется в переменной, которая будет использоваться в запросе GET?

IamToobDude 30.03.2021 03:16

Нет, это разные запросы, поэтому каждый запрос содержит свои разные «экземпляры» (не означает экземпляр узла) вашего приложения. Запросу GET ничего не известно о предыдущем запросе POST. Вы можете сохранить это предыдущее значение где-нибудь в БД или другим способом. В любом случае причина в том, что

boolfalse 30.03.2021 03:21

Лучше отправить поисковый запрос с запросом GET в качестве дополнительного параметра.

boolfalse 30.03.2021 03:26

как бы я именно это сделал @boolfalse

IamToobDude 30.03.2021 03:32

Я не очень хорошо разбираюсь в React, но если вы успешно отправляете эти данные (после отправки формы) спереди назад, то, вероятно, вы можете получить это как «req.body.searchTerm». Таким образом, вы можете использовать это полученное значение

boolfalse 30.03.2021 03:36

Я понял это с помощью вашей помощи @boolfalse, посмотрите мой ответ ниже

IamToobDude 30.03.2021 17:04

Спасибо за ваш ответ

boolfalse 30.03.2021 21:44

Я понял проблему, мой POST не работал по какой-либо причине, поэтому я объединил параметр поискового запроса из поля ввода в запрос GET, и теперь мой прокси-сервер Express правильно взаимодействует с OpenWeatherAPI, извлекает результаты, а затем отправляет результаты обратно клиенту. Я использовал параметры маршрута, о которых вы можете прочитать подробнее о здесь.

РЕФОРМИРОВАННЫЙ КОД РЕАКТА

const WeatherContainer = () => {
    let [searchTerm, setsearchTerm] = useState('')
    let [currentWeather, setCurrentWeather] = useState({});
    let [forecastedWeather, setForecastedWeather] = useState({});
    let [loading, setLoading] = useState(false); 
    
    const handleInput = (e) => {
        setsearchTerm(e.target.value);
    }

    const handleSearch = () => {
        fetch(`/weather/${searchTerm}`)
            .then(res => res.json())
            .then(data => {
                    console.info(data)
               })
    };
    

    return (
        <>
            <div className='search-bar'>
                    <input className='text_input' type='text' name='searchTerm' onChange = {handleInput} placeholder='Enter city' />
                    <button className='search-button' onClick = {handleSearch} type='submit' value='submit' name='button'>
                        <Icon icon = {searchIcon} flip = "horizontal" />
                    </button>
            </div>
            
            <div className='weather_container'>
                <CurrentWeatherComponent />
                <ForecastContainer />
            </div>
        </>
    )

};

РЕФОРМИРОВАННЫЙ ЭКСПРЕСС-КОД

const express = require('express');
const PORT = 5000;
const fetch = require('node-fetch')
const app = express();
const weatherApiKey = '***HIDDEN***';
const cors = require('cors');

app.use(express.static("client"));
app.use(cors());
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// GET Current & Forecast Weather By Search Term
app.get('/weather/:searchTerm', (req, res) => {
    console.info(req.params)
    const searchTerm = req.params.searchTerm;
    console.info(searchTerm)
    
    let currentUrl = `http://api.openweathermap.org/data/2.5/weather?q=${searchTerm}&units=imperial&appid=${weatherApiKey}`;
  
    fetch(currentUrl)
        .then(res => res.json())
        .then(data => {
            res.send(data)
        })
        .catch(err => { 
            res.redirect('/error')
    });  
}); 


app.listen(PORT); 
console.info(`Server is listening on ${PORT}`);

Network Request / Console of Data

Server console showing the search query

Другие вопросы по теме