удаление мутации возвращает ноль

У меня есть список дел, в которых мне удалось успешно добавить новые элементы и обновить кеш, и теперь я работаю над добавлением мутации удаления. Моя конечная цель - вернуть идентификатор из мутации удаления, чтобы этот идентификатор можно было использовать для обновления всего списка задач на стороне клиента.

Я пробовал передать в мутацию идентификатор элемента, но он возвращает ноль.

схема

type Todo {
  _id: ID!
  todo: String!
}

type RootMutation {
  deleteTodo(_id: ID!): Todo
}

решатель

  deleteTodo: async function({ _id }, req) {
    return await Todo.deleteOne({ _id });
  }

Протестировал эту мутацию в интерфейсе graphql по адресу http://localhost:3000/graphql со следующим кодом:

mutation {
  deleteTodo (_id: "example0101010101001010101aasdsadasd"){
        _id
    }
}

получение этой ошибки

{
  "errors": [
    {
      "message": "Cannot return null for non-nullable field Todo._id.",
      "locations": [
        {
          "line": 3,
          "column": 3
        }
      ],
      "path": [
        "deleteTodo",
        "_id"
      ]
    }
  ],
  "data": {
    "deleteTodo": null
  }
}

Поскольку я передаю идентификатор элемента в мутацию, ожидается, что он вернет идентификатор этого удаленного элемента, но я продолжаю получать значение null. Я подозреваю, что проблема в моей функции распознавания.

Ссылка на репо github


person holler    schedule 02.05.2019    source источник
comment
Похоже, ваш преобразователь и функция работают так, как вы планировали. Кажется, что ваша корневая мутация возвращает объект Todo, которого больше не существует. Вместо этого вы можете захотеть вернуть логическое значение.   -  person James Teague II    schedule 03.05.2019


Ответы (1)


Вероятно, вы не захотите использовать здесь метод deleteOne. Глядя на определения типов для mongoose, remove, deleteOne и deleteMany не возвращают удаленный документ. Вместо этого используйте findByIdAndRemove, который вернет удаленный документ или null, если он не был не нашел.

person Daniel Rearden    schedule 03.05.2019
comment
да. По сути, следующий код решил проблему: const deletedTodo = await Todo.findByIdAndDelete({ _id }); return { _id: deletedTodo.id,todo: deletedTodo.todo }; Спасибо, что указали мне правильное направление! - person holler; 03.05.2019