繁体   English   中英

GraphQL和Sequelize不返回插入的对象

[英]GraphQL and Sequelize doesn't return inserted object

我陷入了GraphQLSequelize后端的错误,由于某种原因,即使我保证在解析器中返回的数据,我的变异也不会返回数据。 我觉得这可能是我所想不到的小东西,但是我已经被卡住了一段时间了。

Sequelize部分有效,确实插入了对象,但是返回始终为空对象。

这是我的突变:

mutation {
  createUserVoucher(pinId: 1, voucherId: 1) {
    id
  }
}

这是回报:

{
  "data": {
    "createUserVoucher": {
      "id": null
    }
  }
}

这是我的解析器:

createUserVoucher: (parent, args, { user, models }) => {
  args['userId'] = user.id;
  models.UserVoucher.count({
    where: {utilized: true, pinId: args.pinId, userId: args.userId}
  }).then( c => {
    if (c > 0) {
      return []
    } else {
      models.Voucher.findOne({
        where: {
          id: args.voucherId
        }
      }).then( voucher => {
        models.UserVoucher.count({
          where: { voucherId: args.voucherId }
        }).then( c => {
            return models.UserVoucher.create(args)
        })
      })
    }
  });
  return []
}

UserVoucher定义:

type UserVoucher {
  id: Int
  nodeId: Int!
  userId: ID!
  voucherId: ID!
  voucher: Voucher
  pinId: ID!
  capturedAt: DateTime
  utilized: Boolean
}
`;

变异定义:

createUserVoucher(
  pinId: Int!, 
  voucherId: Int!
): UserVoucher

关于我所缺少的任何想法吗? 将不胜感激,非常感谢! 另外,如果需要更多信息,请告诉我!

您缺少三个回报:

createUserVoucher: (parent, args, { user, models }) => {
  args['userId'] = user.id;
  return models.UserVoucher.count({ <----- HERE
    where: {utilized: true, pinId: args.pinId, userId: args.userId}
  }).then( c => {
    if (c > 0) {
      return []
    } else {
      return models.Voucher.findOne({ // <----- HERE
        where: {
          id: args.voucherId
        }
      }).then( voucher => {
        return models.UserVoucher.count({ // <----- AND HERE
          where: { voucherId: args.voucherId }
        }).then( c => {
            return models.UserVoucher.create(args)
        })
      })
    }
  });
  return []
}

链接诺言时,记住始终在每个then调用内返回所有其他诺言很重要-否则会触发诺言,但不会等待。

几个附加说明:

虽然严格来说不会有任何损害,但您应该在解析器内部返回null而不是空数组。 根据您的架构,您的变异返回一个可为空的UserVoucher对象。 返回空数组会误导任何人阅读您的代码,因为这暗示此解析器应返回数组。

不使用第二个UserVoucher.count调用和Voucher.findOne调用的结果,这意味着可能没有必要吗?

最后,您还可以使用async / await显着清理代码:

createUserVoucher: async (parent, args, { user, models }) => {
  args['userId'] = user.id;
  const c = await models.UserVoucher.count({
    where: {utilized: true, pinId: args.pinId, userId: args.userId}
  })
  if (c > 0) return null
  const voucher = await models.Voucher.findOne({
    where: { id: args.voucherId }
  })
  const c2 = await models.UserVoucher.count({ 
    where: { voucherId: args.voucherId }
  })
  return models.UserVoucher.create(args) // still need a return here
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM