У меня есть экспресс-бэкэнд, который делает запрос 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}`);



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вероятно, в теле обратного вызова Search Weather "$ {searchTerm}" не определено. Итак, вы установили параметр «q» как «undefined», поэтому у вас плохой запрос.
Я проверил это для себя с помощью тестового токена и тоже получил (для пустых условий). Вот За работой и Плохой запрос
Нет, это разные запросы, поэтому каждый запрос содержит свои разные «экземпляры» (не означает экземпляр узла) вашего приложения. Запросу GET ничего не известно о предыдущем запросе POST. Вы можете сохранить это предыдущее значение где-нибудь в БД или другим способом. В любом случае причина в том, что
Лучше отправить поисковый запрос с запросом GET в качестве дополнительного параметра.
как бы я именно это сделал @boolfalse
Я не очень хорошо разбираюсь в React, но если вы успешно отправляете эти данные (после отправки формы) спереди назад, то, вероятно, вы можете получить это как «req.body.searchTerm». Таким образом, вы можете использовать это полученное значение
Я понял это с помощью вашей помощи @boolfalse, посмотрите мой ответ ниже
Спасибо за ваш ответ
Я понял проблему, мой 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}`);
searchTerm объявлен глобально над маршрутом POST, так что будет ли это означать, что мой почтовый маршрут не публикуется, и поэтому поисковый запрос никогда не сохраняется в переменной, которая будет использоваться в запросе GET?