【问题标题】:multiple axios request in a react-native app: best practicesreact-native 应用程序中的多个 axios 请求:最佳实践
【发布时间】:2021-03-26 11:16:38
【问题描述】:

我有一个关于 React Native 应用程序和执行网络请求的问题。

我正在创建一个 React Native 应用程序,作为后端,我正在使用 NodeJS。

用户可以注册/登录,并存储刷新令牌。每次应用打开时,都会获取一个新的刷新令牌(如果用户已登录)。这是每次应用打开时都会发生的网络请求示例。

当应用程序打开并且用户登录时,我会进行第二次网络请求(在第一次网络请求访问令牌成功之后),以检查 redux 中的数据是否必须与数据库。我在数据库中存储了一些一般信息,例如本地用户名+。如果 - 出于任何原因 - 我必须更改数据库中的用户名,我将字段“shouldSync”设置为 true。应用程序向 /api/sync 发送请求,控制器看到 shouldSync = true 并将数据库中的所有数据发回给用户。

我还有第三个网络请求,每次应用打开时都会运行:检查是否有新版本。我向 /api/version 发出请求,响应类似于“1.0.0”。如果本地版本与响应中的版本不同,我会显示一条警报(仅一次),说明应用商店/Play 商店中有新版本。

当应用程序关闭/进入后台模式时,我还会向服务器发出网络请求以存储最后一个活动时间戳。

所有这些请求都有效,我还没有看到任何瓶颈,但我从未构建过生产级应用程序,所以我对这些网络请求有一些疑问。我希望有人能回答他们。

  1. 可以做 3 个单独的网络请求,还是应该尝试将三个请求合并为一个?我可以组合访问令牌请求 + 同步请求(因为这些请求在用户登录时运行),而不是版本请求(因为这个请求总是必须运行)。

  2. 在某些屏幕上,我需要来自数据库/服务器的动态数据。有时我同时运行 3-5 个单独的请求。我正在使用 axios,我的代码是这样的:

// first request
const requestOne = () => {
    return axios({ ... });
};

// second request
const requestTwo = () => {
    return axios({ ... });
};

// run these requests when the screen mounts
useEffect(() => {
    axios.all([requestOne(), requestTwo()])
    .then(axios.spread((requestOneRes, requestTwoRes) => {
        // response from request one
        console.log(requestOneRes.data);
        // response from request two
        console.log(requestTwoRes.data);
    }));
}, []);

这是合并多个请求的好例子吗?

大多数请求没有很多响应数据。我在 Postman 中测试了一些请求,并检查了一些请求的响应大小,我在这里列出了它们:

每次应用打开时:

  • /api/version: 463B 请求大小/231B 响应大小

当用户登录或注册时:

  • /登录:476B 请求大小/1.16kB 响应大小
  • /注册:472B 请求大小/408B 响应大小

应用打开时 + 用户登录时:

  • /api/version: 463B 请求大小/231B 响应大小
  • /refresh-access-token: 649B 请求大小 / 521B 响应大小
  • /api/sync:633B 请求大小/244B 响应大小(未同步)或 592B 响应大小(同步)

总计:+/- 1.6kB 请求大小 / +/- 1.25kB 响应大小

我正在使用 express 和 BodyParser,并将限制设置为 2MB (2,000,000B)。

app.use(bodyParser.json({ limit: 2000000 }));

我在我的 NodeJS 后端安装了request-stats 来记录所有传入的请求。我将分别记录我的应用程序的所有部分并记录所有(大)请求,但目前我没有看到任何大于 10kB 的请求,即使这些请求也非常罕见。

抱歉,文字太长了。我想尽可能清楚。

【问题讨论】:

    标签: react-native axios


    【解决方案1】:

    根据您的身份验证的性质,一个建议是删除 refreshToken 到期。从技术上讲,刷新令牌应该是生成新的 accessTokens 的保留者(其中有一个到期)。如果最终用户没有重新登录,刷新令牌本身不应重新生成。因此,我评估请求的方法不是用户获得新的身份验证令牌,而是 1. 尝试所需的请求,出现 400 错误时,评估 axios 中的响应以进行处理。如果它是无效/过期访问令牌的结果,请使用存储的刷新令牌请求刷新。 2. 重新发送之前的请求。该系统无需在应用启动时进行不必要的请求处理。祝你好运!

    【讨论】:

    • 我没有刷新刷新令牌。我将刷新令牌存储在用户的设备上,并在打开应用程序时,将此刷新令牌发送到服务器以创建新的访问令牌。如果它不再有效(我在数据库中记录了无效的访问令牌),则不会提供新的访问令牌。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多