如何进行服务器端 fetch 调用?

Posted

技术标签:

【中文标题】如何进行服务器端 fetch 调用?【英文标题】:How do I make server-side fetch calls? 【发布时间】:2021-10-31 04:11:14 【问题描述】:

我有一个 React Web 应用程序,它当前确实在客户端获取调用以使用实时信息(例如当前天气)更新仪表板,这意味着随着用户的增加,它将导致不必要的流量调用,并且可能可能会导致此天气网站崩溃。

我想了解的是如何使这些 fetch 调用成为服务器端的?我已经研究过创建一个 Node.js Express 服务器,但我不确定它是否具有对远程主机进行 fetch 调用的功能。

不幸的是,这是我的请求天气代码,但它并没有真正起作用。

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
  )

如果你想进行额外的处理,你可以await 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() - 从 fetch 响应中提取数据

express response.json() - 将 json 发送到响应(通常发送到浏览器)

【讨论】:

我收到[ERR_REQUIRE_ESM]: Must use import to load ES Module 错误,指向我需要节点提取的第 4 行。知道如何解决这个问题吗? 如消息所述,您需要使用import 进行节点获取,而不是require。 the documentation中有例子。

以上是关于如何进行服务器端 fetch 调用?的主要内容,如果未能解决你的问题,请参考以下文章

如何在服务器端提取 req.body(我正在使用 fetch)?

react服务端渲染路由改写

调用 createHttpLink 时 fetch 的类型不匹配

ES6 fetch:如何更改它调用的本地主机端口?

使用 redux-form 和 Fetch API 进行服务器验证

浏览器 Fetch() API 未将正文发布到后端节点服务器