希望将 Amplify API 变得像 Fetch 或 axios 那样简单易用

开场白

自2020年春季开始使用Amplify并完成了一些项目。我认为它是一个能在小规模开发中发挥出相当生产力的平台。

在使用Amplify API(GraphQL)期间遇到的主要问题是很难增加项目成员。

我正在思考如何使团队开发变得更加舒适。

放大API(GraphQL)

Amplify可以自动生成GraphQL客户端,非常方便。

只是导入(import)很麻烦或者很冗长。

import { API, graphqlOperation } from "aws-amplify";
import {
  listCategorys,
} from "graphql/queries";

    async function fetchCategories() {
      const res = await API.graphql(
        // @ts-ignore
        graphqlOperation(listCategorys, {})
      );
      _setCategories(res.data.listCategorys.items);
    }

对于那些熟悉之前的API开发的人来说,这个响应可能有些特殊。

将共同处理事项都放入库中试试看。

如果使用生成的代码进行调用

    • import 文はだいたい同じ

 

    API.graphql ~ res.data 以降の記述は同じパターンで

需要写很多这样的代码。

我试着总结了一下,看起来可以总结一下。

列出

import { * as apiUtil} from "src/apiUtil";

const categories = await apiUtil.listQuery("Category", {});

突变.

import { * as apiUtil} from "src/apiUtil";

await api.createQuery("read", {
   userID: currentUser.id,
   reportID: r.id,
});

获取

import { * as apiUtil} from "src/apiUtil";
const user = await apiUtil.getQuery("user", onUpdateUser.id);

删除

import { * as apiUtil} from "src/apiUtil";

 await apiUtil.deleteQueries("like", { id: like.id });

大多数的代码都遵循同一模式,只要有模型名称就可以生成。

我已经掌握了与使用axios类似的技巧,
所以我期望即使是对Amplify没有经验的人,也能够阅读和编写(?!)。

进一步整合生成的代码意义何在?

我认为每个人都有自己的喜好,但我觉得在团队开发中有许多优点。

    • Amplify GraphQL に明るくない人でも、axiosぐらいの感覚で呼び出せるようになる。(メンバーが増やしやすくなる!!

 

    • 多くのモデルにアクセスしたい時にコードが読みやすくなる。

 

    共通処理が入れれるようになる。エラー表示など。

你在其中进行了什么处理?

将查询以变量的形式展开,并通过参数获取。
在处理列表时,我曾担心会变得很繁琐,但幸好它只是简单地在最后添加一个 “s” 的规则。

学习 – 没有像 study ⇨ studies 那样的处理是很好的…

export async function getQuery(target: string, id: string) {
  let res;
  const queryName = `get${pascalCase(target)}`;
  try {
    //@ts-ignore
    res = await API.graphql(graphqlOperation(queries[queryName], { id }));
    //@ts-ignore
    const data = res.data[queryName];
    // console.log(`getQuery ${target} ${id}`, data);
    return data;
  } catch (error) {
    store.dispatch(app.actions.setError("通信エラーが発生しました"));
    console.error(error);
    return null;
  }
}

如果可以从目标中动态获取Type,我觉得会很好,但是我想不出好的方法。(如果你有任何想法,请一定留下评论)

额外)创建数组

最令人讨厌的是使用数组创建模式,但我也为此做出了简洁的处理。

      const parmas = formActivities.map((activity: any, index: number) => {
        return {
          id: activity.id,
          userID: currentUser.id,
        };
      });

      await createQueries("Activity", parmas);

实施的代码

export async function createQueries(
  target: string,
  variables: any[],
  noGroup?: boolean
) {
  const tasks = [] as any[];

  variables.forEach(async (variable) => {
    const queryName = getQueryName(target, variable);
    const input = await getInput(variable, noGroup);
    console.log(target, queryName, input);

    const task = API.graphql(
      //@ts-ignore
      graphqlOperation(mutations[queryName], {
        input,
      })
    );

    tasks.push(task);
  });

  let resAll;
  try {
    resAll = await Promise.all(tasks);
    console.log("result:", resAll);
  } catch (error) {
    store.dispatch(app.actions.setError("通信エラーが発生しました"));
    console.error(target, error);
  }
  return resAll;
}

在代码中,我正在使用Promise.all函数。

创建的公共函数

我想将它变成图书馆资源,但是时间不够,无法完成。

我们正在招募团队成员!

我现在在 O 公司中,使用 Amplify、React Native 和 React Native Web 开发sass。

我们现在正在招募成员。
对于对Amplify感兴趣并希望尝试的人,请随意申请!
无需有工作经验,兼职和远程都可以。
如果您想在实际工作中尝试使用Amplify,请务必申请!

广告
将在 10 秒后关闭
bannerAds