#node.js #reactjs #backend #react-fullstack
Вопрос:
У меня есть веб-приложение React, которое в настоящее время выполняет запросы на стороне клиента для обновления панели мониторинга с оперативной информацией (например, о текущей погоде), что означает, что с увеличением числа пользователей это приведет к ненужным вызовам трафика и потенциально может привести к сбою этого веб-сайта погоды.
Я пытаюсь понять, как я могу сделать так, чтобы эти вызовы выборки выполнялись на стороне сервера? Я рассматривал возможность создания Node.js Экспресс-сервер, но я не уверен, что у него есть функции для выполнения вызовов выборки на удаленный хост.
Вот мой код с запросом-погода, которая, к сожалению, на самом деле не работает.
const { response } = require('express');
const express = require('express');
const app = express();
var fetch = require('node-fetch');
const port = process.env.PORT || 5000;
app.use(express.json());
// This displays message that the server running and listening to specified port
app.listen(port, () => console.log(`Listening on port ${port}`));
// create a GET route
app.get('/request-info', (req, res) => {
res.send({ information: 'information call successful' });
});
app.get('/request-weather', (req, res) => {
fetch('http://thisotherwebsite.com/weather-query-that-returns-json',
{method: 'GET',
headers: {' Accept': 'application/json'}})
.then(res => {
return res;
})
});
Ответ №1:
Пара вещей:
- Ваш
/request-weather
обработчик делает запросthisotherwebsite
, но ничего не делает с ответом. .then(res => { return res; })
На самом деле ты ничего не делаешь. Вы просто берете то, что уже возвращает fetch, и возвращаете его.
Если вы хотите отправить ответ обратно в браузер, вы можете сделать что-то вроде этого:
fetch(...) // make the request
.then(result => result.json()) // extract the data
.then(data => {
res.json(data); // send it to the browser
})
Если вы хотите выполнить дополнительную обработку, вы можете дождаться вызова fetch, а затем сделать с ним все, что вам нужно:
app.get('/request-weather', async (req, res) => { // make handler async
// get data from the other site
const data = await fetch(...)
.then(response => response.json());
// package it up with some other stuff
responseData = {
fromOtherSite: data,
myExpressStuff: {
foo: 1,
bar: 2,
}
}
// return it to the browser
res.json(responseData);
Ссылка:
- fetch: response.json() — Извлечение данных из ответа на выборку
- экспресс-ответ.json() — Отправка json в ответ (обычно в браузер)
Комментарии:
1. Я получаю
[ERR_REQUIRE_ESM]: Must use import to load ES Module
ошибку, указывающую на строку 4, где мне требуется выборка узлов. Есть идеи, как это обойти?2. Как говорится в сообщении, вам нужно использовать импорт для выборки узлов вместо
require
. В документации есть примеры.