GraphQL和Sequelize不返回插入的对象

时间:2018-03-13 21:48:12

标签: javascript node.js database sequelize.js graphql

我在我的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

关于我缺少的任何想法?非常感谢,非常感谢! 如果需要更多信息,请告诉我们!

1 个答案:

答案 0 :(得分:1)

你错过了三次回报:

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
}