首页 > 解决方案 > 如何使用 Fetch 在 React 中处理“ECONNREFUSED”?

问题描述

我在 React 中有以下与第三方 api 交互的代码。当 Avaya One-X 客户端未在目标 PC 上运行时,我在控制台中收到错误连接被拒绝,这是正常的。问题是代码设置为每 5 秒运行一次,并且只要 one-x 客户端未运行,控制台就会充满这些错误。

我怎样才能更好地处理这个?没有记录这么多次会很好。

  fetchData = (url) => {
    return new Promise((res, rej) => {
      fetch(url)
        .then((r) => r.text())
        .then((text) => {
          res(text);
        })
        .catch((e) => rej(e));
    });
  };

  getLogs = async () => {
    try {
      const { user } = this.props.auth;
      const regxmlPromise = this.fetchData(
        `http://127.0.0.1:60000/onexagent/api/registerclient?name=${user.id}`
      );
      const clientIdPromise = this.fetchData(
        `/api/avaya/${user.id}/getclientid/`
      );

      
      const resolves = await Promise.all([regxmlPromise, clientIdPromise]);

      const [registration, clientId] = resolves || [];

      const nextNotification = await this.fetchData(
        `http://127.0.0.1:60000/onexagent/api/nextnotification?clientid=${clientId}`
      );

      if (registration) {
        const regxml = new XMLParser().parseFromString(registration);
        if (regxml.attributes.ResponseCode === "0") {
          axios.post(`/api/avaya/${user.id}/register/`, regxml);
          console.log("ClientId sent!");
        }
      }

      if (nextNotification) {
        const xml = new XMLParser().parseFromString(nextNotification);
        if (
          xml.children[0].name === "VoiceInteractionCreated" ||
          xml.children[0].name === "VoiceInteractionMissed" ||
          xml.children[0].name === "VoiceInteractionTerminated"
        ) {
          console.log(xml);
          console.log(xml.children[0].name);
          axios.post(`/api/avaya/${user.id}/logcalls/`, xml);
        }
      }
    } catch (error) {
      console.log(error);
    }
  };

  timer = (time) => {
    const date = new Date(time);
    return `${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}`;
  };

  componentDidMount() {
    this.getLogs();
    this.callsInterval = setInterval(this.getLogs, 5000);
  }

  componentWillUnmount() {
    clearInterval(this.callsInterval);
  }

为了让事情更清楚,这里是控制台的屏幕截图。我收到连接被拒绝的 Get 错误以及我捕获并记录的实际错误。因此,即使我发现错误并且什么都不做,无论如何我仍然会在控制台中拒绝连接。

一件有趣的事情是,如果我使用 fetch-node,我会得到不同的行为和错误消息。node 的错误是一个对象并且具有不同的道具。在 React 中,如果我 console.log 获取请求错误,我只会得到“TypeError:无法获取”

在此处输入图像描述

标签: javascriptnode.jsreactjsfetchfetch-api

解决方案


因此,如果您只是想隐藏网络错误消息,您可以单击 Chrome 中的齿轮箱并点击“隐藏网络”。显然在 Chrome 中,即使您发现网络错误,它们仍会冒泡到控制台,除非您选择它。我使用的是 Firefox,一开始并没有发现问题。

在此处输入图像描述

可以在此处找到更多信息:Catching net::ERR_NAME_NOT_RESOLVED 用于修复错误的 img 链接


推荐阅读