我应该从节点(服务器端)还是在 react(客户端)调用 api?

Should I call api from node (server side) or in react (client side)?

提问人:harsh vardhan 提问时间:5/14/2021 更新时间:5/14/2021 访问量:561

问:

我试图从政府网站调用api,以获得该密码中的covid疫苗。我在一个名为 searchbypinapi.js 的文件中创建了一个带有 api 调用的函数,并在 Pindiv.jsx 中导入并使用了该函数。(我正在发布两个文件的代码)

searchbypinapi.js

import axios from 'axios';

const Searchbypinapi = (pincode) => {
    
    var today = new Date();
    var date = today.toJSON().slice(0, 10);
    var nDate = date.slice(8, 10) + '-' + date.slice(5, 7) + '-' + date.slice(0, 4);
    let pincodeconfig = {
        method: 'get',
        url: 'https://cdn-api.co-vin.in/api/v2/appointment/sessions/public/calendarByPin?pincode=' + pincode +'&date=' + nDate ,
        headers: {
            'accept': 'application/json',
            'Accept-Language': 'hi_IN',
            'User-Agent': 'covid19'
        }
      };
      axios(pincodeconfig)
          .then((response) => {
            return(response.data);
          })
          .catch(error => {
              return error;
          });

      
      
};

export default Searchbypinapi;

Pindiv.jsx

import React, { useState } from 'react';
import Searchbypinapi from '../../api/searchbypinapi';

const Pindiv = () => {

    const [input, setInput] = useState("");

    const handleChange = (event) => {
        setInput(event.target.value);
    }

    const handleClick = (event) => {
        Searchbypinapi(input)
            .then((data) => {
                console.log(data);
            });
    }

    return (
        <div id="pincode" className="pinsearch d-flex justify-content-center">
            <div class="example">
                    <input type="text" autoComplete="off" onChange={handleChange} placeholder="Search.." name="search" />
                    <button type="button" onClick={handleClick} ><i class="fa fa-search"></i></button>
            </div>

            
        </div>
    )
}

export default Pindiv

当我在 react 中调用 api 时,它给出错误:-

单击此处查看错误屏幕截图

但是当我在 nodejs 中运行相同的 api 时,它成功地console.log() 数据。

我很困惑,因为它没有在 reactjs 中运行。请向我建议任何解决方案,或者我应该创建一个服务器文件夹来创建 api 请求,然后使用 axios 将其发送到客户端。

注意:- 我还使用了其他 api,例如 (https://api.covid19india.org/data.json) 它们运行良好,只有这个 api 没有运行。

node.js reactjs 服务器端 客户端 mern

评论


答:

0赞 rveerd 5/14/2021 #1

由于 CORS(跨域请求共享),您的请求被阻止。

第三方服务器(在本例中)确定可以访问服务器的来源(其他网站)。显然,您的网站是不允许的。co-vin.in

但是,CORS 由浏览器强制执行。这就是为什么你的请求不能在浏览器(你的 React 应用程序)上工作,而是在你的服务器上工作。

作为解决方案,您可以按照您的建议,通过服务器代理请求。