如何使用 GraphQL 突变在解析器中添加递归逻辑?

How do I add recursive logic in resolvers using GraphQL mutations?

是否可以使用 GraphQL 变更在解析器中添加逻辑?

如果用户没有提供,我正在尝试创建一个四位数的字符串作为 post 的别名。然后,我想查询数据库,看看是否存在这个四位数的字符串。如果字符串存在,我想递归地创建另一个四位数的字符串。

目前,我正在探索向解析器中的突变添加逻辑,但我不确定这是否可行。我正在使用这些文档作为我的基础:graphql.org sequelize.org

这是我当前的代码块:

工作于 2020 年 12 月 4 日

const MakeSlug = require("./services/MakeSlug");

const resolvers = {
  Query: {
    async allLinks(root, args, { models }) {
      return models.Link.findAll();
    },
    async link(root, { id }, { models }) {
      return models.Link.findByPk(id);
    }
  },
  Mutation: {
    async createLink(root, { slug, description, link }, { models }) {
      if (slug !== undefined) {
        const foundSlug = await models.Link.findOne({
          where: { slug: slug }
        });
        if (foundSlug === undefined) {
          return await models.Link.create({
            slug,
            description,
            link,
            shortLink: `https://shink.com/${slug}`
          });
        } else {
          throw new Error(slug + " exists. Try a new short description.");
        }
      }

      if (slug === undefined) {
        const MAX_ATTEMPTS = 10;
        let attempts = 0;
        while (attempts < MAX_ATTEMPTS) {
          attempts++;
          let madeSlug = MakeSlug(4);
          const foundSlug = await models.Link.findOne({
            where: { slug: madeSlug }
          });
          if (foundSlug !== undefined) {
            return await models.Link.create({
              slug: madeSlug,
              description,
              link,
              shortLink: `https://shink.com/${madeSlug}`
            });
          }
        }
        throw new Error("Unable to generate unique alias.");
      }
    }
  }
};

module.exports = resolvers;

这是我的完整 codebase

谢谢!

while 循环解决了这个难题。谢谢 xadm.

const MakeSlug = require("./services/MakeSlug");

const resolvers = {
  Query: {
    async allLinks(root, args, { models }) {
      return models.Link.findAll();
    },
    async link(root, { id }, { models }) {
      return models.Link.findByPk(id);
    }
  },
  Mutation: {
    async createLink(root, { slug, description, link }, { models }) {
      if (slug !== undefined) {
        const foundSlug = await models.Link.findOne({
          where: { slug: slug }
        });
        if (foundSlug === undefined) {
          return await models.Link.create({
            slug,
            description,
            link,
            shortLink: `https://shink.com/${slug}`
          });
        } else {
          throw new Error(slug + " exists. Try a new short description.");
        }
      }

      if (slug === undefined) {
        const MAX_ATTEMPTS = 10;
        let attempts = 0;
        while (attempts < MAX_ATTEMPTS) {
          attempts++;
          let madeSlug = MakeSlug(4);
          const foundSlug = await models.Link.findOne({
            where: { slug: madeSlug }
          });
          if (foundSlug !== undefined) {
            return await models.Link.create({
              slug: madeSlug,
              description,
              link,
              shortLink: `https://shink.com/${madeSlug}`
            });
          }
        }
        throw new Error("Unable to generate unique alias.");
      }
    }
  }
};

module.exports = resolvers;