React内部useEffect中使用fetch的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了React内部useEffect中使用fetch的问题相关的知识,希望对你有一定的参考价值。

我是node和react的新手,我正在尝试获取一些数据并将其显示在我的react页面上。很简单我有一个运行在localhost:3001上的快递服务器,我的react应用程序在localhost:3000上。我试图获取数据,然后通过挂钩将数据设置为一种状态。我似乎无法在react页面或Web开发人员控制台中获取数据。有什么方法可以查看在控制台中获取的数据吗?

这是我的React组件:

import React, { useState } from "react";


function App() {

  const [weatherData, setWeatherData] = useState("");
  console.log(weatherData);

  React.useEffect(() => {
    const fetchData = async () => {
      const result = await fetch(
        "http://localhost:3001"
      );
      const data = await result.json();
      console.log("data", data);


      setWeatherData(data);
    };

    fetchData();
  })

  return (
    <div>
      <h1>The temprature is {weatherData}</h1>
    </div>
  );
}

export default App;

这是我的节点服务器:

const express = require('express');
const bodyParser = require('body-parser');
const https = require("https");
const cors = require('cors');

const app = express();

app.use(cors());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.set('view engine', 'jsx')


app.use(express.static("public"));

app.get("/", function (req, res) {
  const query = Chicago;


  const apiKey = "a valid key";
  const unit = "imperial";
  const url = "https://api.openweathermap.org/data/2.5/weather?appid=" + apiKey + "&q=" + query + "&units=" + unit;


  https.get(url, (response) => {
    console.log("statusCode", res.statusCode);

    response.on("data", (d) => {
      const weatherData = (JSON.parse(d));
      console.log(weatherData);
      res.send(weatherData);

    });
  }).on("error", (e) => {
    console.error(e);
  })
});

const port = process.env.PORT || 3001;

app.listen(port, () => console.log(`Listening on port ${port}`));

我得到的结果是没有数据,并且在chrome开发工具控制台中出现了这2个错误。

index.js:1未捕获的语法错误:意外令牌'

App.jsx:19未捕获(在承诺中)SyntaxError:意外令牌

任何帮助将不胜感激!

答案

似乎在result.json()中可能发生错误。

可能是请求返回html,而不是json。

您可以使用邮递员或其他工具通过'localhost:3001'获得真正的响应,以清除错误所在。

另一答案

您需要指定从服务器返回的数据的Content-Type

您可以在发送响应之前使用res.setHeader,也可以使用res.json()发送json响应

https.get(url, (response) => {
    console.log("statusCode", res.statusCode);

    response.on("data", (d) => {
      const weatherData = JSON.parse(d);
      console.log(weatherData);
      res.json(weatherData); // use json response

    });
  }).on("error", (e) => {
    console.error(e);
  })

以上是关于React内部useEffect中使用fetch的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React Native 应用程序中使用 React hook useEffect 为每 5 秒渲染设置间隔?

无效的挂钩调用。钩子只能在反应函数组件内部使用...... useEffect,redux

如何使用 React Hooks 和 Context API 正确地将来自 useEffect 内部调用的多个端点的数据添加到状态对象?

React - nextjs 在 useEffect 中调用自定义钩子

无法使用 fetch POST 方法对未安装的组件执行 React 状态更新

React 无法在 useEffect 内部设置状态,不会在当前周期更新状态,而是在下一个周期更新状态。这可能是啥原因造成的?