我必须在带有 Sequelize 的 GraphQL 突变中返回啥?

Posted

技术标签:

【中文标题】我必须在带有 Sequelize 的 GraphQL 突变中返回啥?【英文标题】:What must I return in a GraphQL Mutation with Sequelize?我必须在带有 Sequelize 的 GraphQL 突变中返回什么? 【发布时间】:2016-05-15 11:48:12 【问题描述】:

我正在尝试实现一个在后端使用 Sequelize 的 GraphQL 服务器(在幕后使用 MSSQL)。 而且我有一个按预期工作的查询(从单个 SQL 表中检索数据)。

然后我为相同的模式设置了一个突变,当我在 GraphiQL 中运行突变时,我发现,虽然它确实执行了突变的解析函数中的东西(这是创建我的 Sequelize 模式的实例) ,它不会将我的对象返回给我。

现在,我认为这是因为我的 Sequelize .create 函数返回了一个承诺,而 resolve 无法处理?

这是我目前所得到的:

resolve(_,args)
  Forecast.create(
    bunit: args.bunit,
    season: args.season,
    position: args.position,
    currency: args.currency,
    settle_date: new Date(args.settle_date),
    reference: args.reference
  ).then(forecast => 
    return forecast;
  ).catch(err => 
    console.error(err);
    return err;
  );

我找不到任何明确的解释或教程来告诉我如何构建解析函数在异步执行某些操作时需要返回的内容。或者我就是不明白,这也很有可能。

【问题讨论】:

你应该像这样returnreturn Forecast.create(... 一开始我也是这样做的,但它不起作用。但是,我刚刚也删除了 .then.catch 调用,有效地将返回承诺的处理留给了 resolve 函数,这似乎有效! 我确实想知道,这对于错误处理等意味着什么。我的突变会自动返回对承诺的拒绝吗? 【参考方案1】:

删除 thencatch 实现是可行的,但不应该这样做,你遇到了一个 Promise then-chain。 每个then(或catch)return 部分都会更改解析器的返回值。

因此,在Forecast 上添加return 并在then 中返回,catch 是正确的方法

resolve(_,args)
      return Forecast.create(
        bunit: args.bunit,
        season: args.season,
        position: args.position,
        currency: args.currency,
        settle_date: new Date(args.settle_date),
        reference: args.reference
      );
       .then(forecast => 
         console.error(err);
         return forecast;
       ).catch(err => 
         console.error(err);
         return err;
       );

      return newForecast;
    
  

【讨论】:

这绝对行不通:a)因为您忘记在 .then() 调用之前删除分号,b)因为您在最后返回“newForecast”不存在。这些都不是必需的,只需返回 Forecast.create() 返回的 Promise,如上。【参考方案2】:

@Adam 的上述建议在这种情况下有效。 我很惊讶我们不需要阅读.create 方法调用的承诺,但它似乎工作得很好。

resolve(_,args)
      return Forecast.create(
        bunit: args.bunit,
        season: args.season,
        position: args.position,
        currency: args.currency,
        settle_date: new Date(args.settle_date),
        reference: args.reference
      );
      // .then(forecast => 
      //   console.error(err);
      //   //return forecast;
      // ).catch(err => 
      //   console.error(err);
      //   //return err;
      // );

      //return newForecast;
    
  

谢谢!

【讨论】:

这样可以看到sequelize的错误? @stackdave 是的,如果您的解析器(在本例中为 Sequelize 的 .create 函数)的承诺被拒绝,graphql 将在其响应中添加一个“错误”属性(与“数据”相同)原因。

以上是关于我必须在带有 Sequelize 的 GraphQL 突变中返回啥?的主要内容,如果未能解决你的问题,请参考以下文章

sequelize/sequelize-typescript - 带有 HasMany 的 findAll 返回一个对象而不是数组

带有 sequelize 和 nest.js 的多租户

sequelize.js 中的字母数字 ID

TypeScript - 带有 Sequelize 的存储库模式

Sequelize - 我必须在模型和查询中都指定“as”吗?

sequelize-typescript - 当使用带有 `tsc` 编译器(带有 NestJS)的 glob 配置时,无法解析模型模块