如何通过module.exports从axios响应中读取数据?

IT技术 node.js json reactjs axios
2021-05-07 14:44:09

我需要通过 module.export 从 axios 响应中读取数据。这是我的数据: http://localhost:8001

{
    "name":"Nama Nih",
    "desc":"Sekolah Terpadu Al-Qudwah - Yayasan Islam Qudwatul Ummah",
    "prefix":"alqudwah",
    "footerText":"Yayasan Islam Qudwatul Ummah | All Rights Reserved 2020",
    "logoText":"Al-Qudwah",
    "needLogin":false
}

我使用以下代码从 axios 调用数据: brand.js

var axios = require('axios');

module.exports = axios.get('http://localhost:8001', {
  headers: {
    'Access-Control-Allow-Origin': '*',
    'Content-Type': 'application/json'
  }})
  .then(function (response) {
    return response.data;
  })
  .catch(function (error) {
    console.log(error);
  })
  .then(function () {
  });

但是当我读取响应数据时,它并不像预期的那样。我尝试像这样控制台日志返回值: 在此处输入图片说明

这是我的代码,我在其中 console.log 响应。

import React, { PureComponent } from 'react';
import brand from 'ba-api/brand';
import { Helmet } from 'react-helmet';

class Dashboard extends PureComponent {
  render() {
    console.log(brand);
    const title = brand.name + ' - Dashboard';
    const description = brand.desc;
    const { classes } = this.props;
    return (
      <div>
        <Helmet>
          <title>{title}</title>
          <meta name="description" content={description} />
          <meta property="og:title" content={title} />
          <meta property="og:description" content={description} />
          <meta property="twitter:title" content={title} />
          <meta property="twitter:description" content={description} />
        </Helmet>
      </div>
    );
  }
}

Dashboard.propTypes = {
  classes: PropTypes.object.isRequired,
};

export default withStyles(styles)(Dashboard);

如何读取这些数据?

2个回答

嗯,你不能直接导出获取的数据。从技术上讲,您可以通过以下方式实现类似的目标:

注意:以下不是最佳实践方法。在 React 组件中,更喜欢suggested方法。

// brand.js
module.exports = (() => {
   const request = new XMLHttpRequest();
   request.open('GET', 'http://localhost:8001', false);
   request.send(null);

   if (request.status === 200) {
     return request.responseText;
   }
})();

建议的方法

如果您可以在没有同步访问请求资源的情况下生存,您可以将 axios 包装在自定义钩子中。

import { useEffect, useState } from 'react';

const useAxios = (url) => {
  const [state, setState] = useState({});

  useEffect(() => {
    axios
       .get(url)
       .then(({ data }) => setState({ data }))
       .catch(error => setState({ error }));     
  }, []);

  return state;
}

// .. in your component
const Component = () => {
   const { data, error } = useAxios('http://localhost:8001');

   if (error) {
     ... error component
   }

   if (!data) {
     ... loading component
   }

   return (
     ... component that is consuming `data`
   );
}

在您的特定情况下,由于您仅将这些数据用于设置元数据,因此您可以跳过错误和加载组件。

我用这个解决方案解决了这个问题: brand.js

var axios = require('axios');

const sendGetRequest = async () => {
  try {
      const resp = await axios.get('http://localhost:8001', {
        headers: {
          'Access-Control-Allow-Origin': '*',
          'Content-Type': 'application/json'
        }})
        .then(function (response) {
          return response.data;
        });
      return resp;
} catch (err) {
      console.error(err);
  }
};

module.exports = sendGetRequest();

我用以下代码调用该函数:

import React, { PureComponent } from 'react';
import brand from 'ba-api/brand';
import { Helmet } from 'react-helmet';

class Dashboard extends PureComponent {
  constructor(props){
    super(props);
    this.state = {
      title: '',
      description: ''
    }  
  }
  componentDidMount(){
    brand.then(data => {
      this.setState({
        title: data.name,
        description: data.desc
      });  
    });
  }
  render() {
    const title = this.state.title + ' - Dashboard';
    const description = this.state.description;
    const { classes } = this.props;
    return (
      <div>
        <Helmet>
          <title>{title}</title>
          <meta name="description" content={description} />
          <meta property="og:title" content={title} />
          <meta property="og:description" content={description} />
          <meta property="twitter:title" content={title} />
          <meta property="twitter:description" content={description} />
        </Helmet>
      </div>
    );
  }
}

Dashboard.propTypes = {
  classes: PropTypes.object.isRequired,
};

export default withStyles(styles)(Dashboard);

感谢所有回答我问题的人。