【问题标题】:Graphql Calling Axios Multiple Calls Performance/RefactoringGraphql调用axios多次调用性能/重构
【发布时间】:2020-06-08 20:29:00
【问题描述】:

我可以删除数据并将其添加到我的 JSON 文件中,但如果我一直按下按钮(切换添加/删除),我会遇到网络故障。我假设我不能像这样发出多个请求?

const handleSave = save => {
  if (save.toLowerCase() === 'save') {
    props
      .addSaved({
        variables: {
          id: props.id,
        },
      })
      .then(res => {
        setSaved('Unsave');
        setSavedPropData(res.data.addSaved);
      });
  } else {
    props
      .deleteSaved({
        variables: {
          id: savedPropData.id,
        },
      })
      .then(() => setSaved('Save'));
  }
};

以上是我的句柄保存数据的sn-p。因此,每次按下它都会切换保存或取消保存,然后它会将数据添加或删除到我的 JSON 中。我目前正在使用 json 服务器来测试应用程序。

const savedMutate = gql`
  mutation addSaved($id: String) {
    addSaved(id: $id) {
      id
    }
  }
`;

const deletedMutate = gql`
  mutation deleteSaved($id: String) {
    deleteSaved(id: $id) {
      id
    }
  }
`;

export default _.flowRight(
  graphql(savedMutate, {name: 'addSaved'}),
  graphql(deletedMutate, {name: 'deleteSaved'}),
)(withNavigation(Card));

如果我将应用程序部署到生产环境中,是否有更好的方法来做到这一点?目前,当我快速切换时,我遇到了网络故障。我刚刚又试了一次,是不是因为我的应用程序每次都会刷新,而在刷新时,我试图保存到我的数据库中,但它还没有完全挂载?这只发生在开发中吗?

突变:

addSaved: {
  type: SavedType,
  args: {
    id: {type: GraphQLString},
  },
  resolve(parentValue, {id}) {
    return axios
      .post(`http://localhost:3000/saved`, {id})
      .then(res => res.data);
  },
},
deleteSaved: {
  type: SavedType,
  args: {
    id: {type: GraphQLString}
  },
  resolve(parentValue, {id}) {
    return axios
      .delete(`http://localhost:3000/saved/${id}`)
      .then(res => res.data);
  },
},

【问题讨论】:

  • 错误是什么?您将需要一个中间件来管理请求并在需要时取消正在进行的请求。
  • 它更像是一个黄色警告,说网络故障。我注意到每次我提出请求时,我的 nodemon 都会重新启动,因此我的开发应用程序会重新启动。我假设这就是原因,因为我在“刷新”应用程序时发出请求。处理对数据库的同时请求时的最佳实践是什么?如果它在生产中,还会发生这种情况吗?
  • 网络故障,请检查原因,如果有道理,请重试。对于对数据库的并发请求,通常有一个中间件管理“请求”或事件队列。然后在更大的范围内,您将需要为您的数据库进行分片和复制 + 一些容错机制(即拜占庭容错)

标签: reactjs react-native graphql refactoring apollo


【解决方案1】:

如果您使用 nodemon 运行您的服务器并且您正在写入某个文件以响应请求并且该文件正在被 nodemon 监视,那么您的请求将始终触发服务器重新启动。由于第一个请求会重新启动服务器,因此紧随其后的任何请求都将失败,因为您的服务器在重新启动时将关闭。

您需要configure nodemon to ignore the appropriate files or directories。这样,对文件的任何更改都不会导致 nodemon 重新启动您的服务器。

【讨论】:

  • 感谢您的详尽解释。在生产中,这不会发生,对吧? @Joseph D,解释说我必须找到一个管理请求的中间件。
  • 如果您的设置在生产中是相同的,那么是的,它会发生。据推测,在生产中(甚至在开发中)你应该使用数据库而不是直接写入文件,在这种情况下不会看到这种行为,除非你有 nodemon 出于某种原因监视你的数据库目录。
  • 啊,明白了!是的,我将在生产环境中将其写入 mongodb。我只是使用 JSON 服务器来构建应用程序。感谢您的帮助!
猜你喜欢
  • 2022-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-05
  • 2017-03-21
相关资源
最近更新 更多