Как я могу выполнять вызовы выборки на стороне сервера?

#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:

Пара вещей:

  1. Ваш /request-weather обработчик делает запрос thisotherwebsite , но ничего не делает с ответом.
  2. .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 . В документации есть примеры.