简体   繁体   English

如何从节点 js 获取 API 数据以在 React 上显示

[英]How to get API data from node js to display on React

I'm learning react and node js and I'm making a macro calculator website and basically I get data (calories, macro ratio, etc..) from the user on client side then using those data I make a get request to edamam API server to get (foodID, uri, unit) and post those data again to get macros for each food.我正在学习 react 和 node js,我正在制作一个宏计算器网站,基本上我从客户端的用户那里获取数据(卡路里、宏比率等),然后使用这些数据向 edamam API 发出获取请求服务器获取(foodID,uri,unit)并再次发布这些数据以获取每种食物的宏。 Then I calculated data.然后我计算了数据。 (It's working fine up to this point on the backend). (到目前为止,它在后端工作正常)。 And I want send this data to back to frontend to display and it's not working here.我想将此数据发送回前端以显示,但它在这里不起作用。 I'm using axios for the requests.我正在使用 axios 来处理请求。 I'm also not too sure it's right way to make API calls.我也不太确定进行 API 调用的正确方法。 Any help would be appreciated Thank you任何帮助将不胜感激谢谢

Send data to backend from React从 React 向后端发送数据

async function postData(e){
    e.preventDefault();

    try{
      await axios.post("http://localhost:4000/getData", {formData})
    }
    catch(error){
      console.log(error.response.data);
    }
  }

Node.js to make API calls and process data Node.js 进行 API 调用和处理数据

app.post("/getData", (req, res) =>{
  // data from React
  const targetKcal = req.body.formData.calories;
  const proteinRatio = req.body.formData.proteinRatio;
  const fatRatio = req.body.formData.fatRatio;
  const carbRatio = req.body.formData.carbRatio;
  const proteinSource = req.body.formData.proteinSource;
  const fatSource = req.body.formData.fatSource;
  const carbSource = req.body.formData.carbSource;
  const getURL = "https://api.edamam.com/api/food-database/v2/parser?";
  const postURL = "https://api.edamam.com/api/food-database/v2/nutrients?";
  //GET Request to parse and get uri and foodID to post
  try{
    Promise.all([
      axios.get(getURL, {params :{"ingr" : proteinSource}}),
      axios.get(getURL, {params :{"ingr" : fatSource}}),
      axios.get(getURL, {params :{"ingr" : carbSource}}),
  
  ]).then(axios.spread((proteinData, fatData, carbData) => { 
    try{
     //post data to get macro info for each macros
    Promise.all([
      axios.post(postURL, {"ingredients" :[{"quantity":1, "measureURI": proteinData.data.hints[0].measures.filter(obj => obj["label"] === "Gram")[0].uri,"foodId":proteinData.data.parsed[0].food.foodId}]}),
 
      axios.post(postURL, {"ingredients" :[{"quantity":1, "measureURI": fatData.data.hints[0].measures.filter(obj => obj["label"] === "Gram")[0].uri,"foodId":fatData.data.parsed[0].food.foodId}]}),
  
      axios.post(postURL, {"ingredients" :[{"quantity":1, "measureURI": carbData.data.hints[0].measures.filter(obj => obj["label"] === "Gram")[0].uri,"foodId":carbData.data.parsed[0].food.foodId}]})
    
     ]).then(axios.spread((data1, data2, data3) => {

          let proteinKcal = data1.data.totalNutrients.ENERC_KCAL.quantity;
          let protein = data1.data.totalNutrients.PROCNT.quantity;
          let proteinFat = data1.data.totalNutrients.FAT.quantity;
          let proteinCarb = data1.data.totalNutrients.CHOCDF.quantity;

          let fatKcal = data2.data.totalNutrients.ENERC_KCAL.quantity;
          let fatProtein = data2.data.totalNutrients.PROCNT.quantity;
          let fat = data2.data.totalNutrients.FAT.quantity;
          let fatCarb = data2.data.totalNutrients.CHOCDF.quantity;


          let carbKcal = data3.data.totalNutrients.ENERC_KCAL.quantity;
          let carbProtein = data3.data.totalNutrients.PROCNT.quantity;
          let carbFat = data3.data.totalNutrients.FAT.quantity;
          let carb = data3.data.totalNutrients.CHOCDF.quantity;

          //Calculate each macros for target calories 
          const proteinTargetGram = (targetKcal * (proteinRatio / 100))/proteinKcal;
          const fatTargetGram = (targetKcal * (fatRatio / 100))/fatKcal;
          const carbTargetGram = (targetKcal * (carbRatio / 100))/carbKcal;
          
          proteinKcal *= proteinTargetGram;
          protein *= proteinTargetGram;
          proteinFat *= proteinTargetGram;
          proteinCarb *= proteinTargetGram;
          
          fatKcal *= fatTargetGram;
          fatProtein *= proteinTargetGram;
          fat *= fatTargetGram;
          fatCarb *= proteinTargetGram; 

          carbKcal *=carbTargetGram;  
          carbProtein *= proteinTargetGram;
          carbFat *= proteinTargetGram;
          carb *= carbTargetGram;

          const totalKcal = (proteinKcal + fatKcal + carbKcal).toFixed(0);
          const totalProtein = (protein + fatProtein + carbProtein).toFixed(0);
          const totalFat = (proteinFat + fat + carbFat).toFixed(0);
          const totalCarb = (proteinCarb + fatCarb + carb).toFixed(0);

          const data = {
            "totalKcal": totalKcal, 
            "totalProtein": totalProtein,
             "totalFat": totalFat,
             "totalCarb": totalCarb, 
             "proteinTargetGram": proteinTargetGram,
             "fatTargetGram": fatTargetGram,
             "carbTargetGram":carbTargetGram
            };
        
          //send back the data
          res.json(data);
          
    }))
    }catch(err) { console.log(err); }
  }));
  }
  catch (err) { console.error(err); }
});

Use the data to display on React使用数据在 React 上显示

function Result() {
  const [data, setData] = useState([]);
  
  useEffect(()=>{
    const getData = async ()=> {
      const response = await axios.get('/getData');
      setData(response.data);
    };
    getData();
  });
  

  return (
    <div>
      <h1>{data.map(item => item)}</h1>
    </div>
  )
}

export default Result

Error message错误信息

chrome控制台错误信息

-----------------------Edit------------------------------------------- - - - - - - - - - - - -编辑 - - - - - - - - - - - - - -----------------

Instead of res.json(data) I added below我在下面添加了 res.json(data) 而不是 res.json(data)

axios.post('/getData', data)
.then(res => console.log(res.json))
.catch(err => console.log(err.json));

display on react反应时显示

function Result() {
  const [data, setData] = useState([]);
  
  useEffect(()=>{
    const getData = async ()=> {
      const response = await axios.get('http://localhost:4000/getData');
      setData(response.data);
    };
    
    getData();
  });
  

  return (
    <div>
      <h1>{Object.keys(data).map(key => data[key])}</h1>
    </div>
  )
}

I still get an error我仍然收到错误

在此处输入图像描述

Your error is generated because you are asking to a GET method that doesn't exist on backend, that's why you see 404 there.生成错误是因为您要求后端不存在的 GET 方法,这就是您在那里看到 404 的原因。 You actually have a POST declared (getData), you should request to the POST method by passing the values on the body.您实际上有一个 POST 声明(getData),您应该通过在主体上传递值来请求 POST 方法。 something like this:像这样的东西:

axios.post('/getData', {
// pass the formData here
  formData:{ 
      // calories: ...,
      // ...
  }
})
.then(function (response) {
    // update state
})
.catch(function (error) {
    // handle error
});

Axios is fine, if you don't want to use an external package you can use fetch. Axios 很好,如果您不想使用外部 package 可以使用 fetch。 You can find the documentation here .您可以在此处找到文档。

For the render: you have to do something different, since you are receiving an object you should map on keys, change this:对于渲染:你必须做一些不同的事情,因为你收到一个 object 你应该在键上 map ,改变这个:

<h1>{data.map(item => item)}</h1>

to something like this:像这样:

<h1>{Object.keys(data).map(key => key + ": " + data[key])}</h1>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在 react js 上显示来自外部 API 的数据? - How do I display data from an external API on react js? reactjs中如何从顶层的API获取数据? - How to get the data from the API at the top level in react js? 如何获取chart.js图表​​以在Node / React Web应用程序中显示数据? - How do I get a chart.js chart to display data in a Node/React web application? 如何从 API 获取响应数据并从数据中编码函数以使用 node js JavaScript 获取结果 - How to get the response data from API and code the function from data to get the result using node js JavaScript 如何在反应中显示来自api的数据 - How to display data from the api in react 如何使用节点 js 中的 API 密钥从 REST api 获取数据? - How to get data from REST api using an API key in node js? 如何在React Redux中显示来自节点js的错误响应 - How display this error response from node js in react redux 如何在React.js前端应用程序中显示来自Rails 5 API的数据? - How to display data from Rails 5 API in React.js frontend app? 从 React js 中的“根”DOM 节点获取数据属性 - get data attribute from “root” DOM node in react js 如何使用从Node js到React js的响应数据呈现页面? - How to render page with a response data from node js to React js?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM