Запрос мутации graphiql успешно выполняется, но возвращает ноль - PullRequest
0 голосов
/ 21 декабря 2018

Когда я выполняю мутацию в graphiql, который использует мой код для сервера GraphQL, он возвращает ноль для всех записей в объекте.

Я использую серверную часть Node and Express и использую базу данных MongoDB, которая использует mongoose для доступа к ней.

updateTodo: {
  type: TodoType,
  args: {
    id: {
      type: new GraphQLNonNull(GraphQLID)
    },
    action: {
      type: new GraphQLNonNull(GraphQLString)
    }
  },
  resolve(parent, args) {
    return Todo.updateOne({ // updateOne is a MongoDB/mongoose function
      _id: args.id
    }, {
      $set: {
        action: args.action
      }
    });
  }
}

Что я получаю

{
  "data": {
    "updateTodo": {
      "id": null,
      "action": null
    }
  }
}

из следующего

mutation {
  updateTodo(id: "5c18590fa6cd6b3353e66b06", action: "A new Todo") {
    id
    action
}

Я делаю это потом

{
  todos{
    id
    action
  }
}

и получаю это

{
  "data": {
    "todos": [
      {
        "id": "5c18590fa6cd6b3353e66b06",
        "action": "A new Todo"
      }
    ]
  }
}

, поэтому я знаю, что это работает, но предпочел бы получитьвозвращение новых данных.

Дополнительная информация

const TodoType = new GraphQLObjectType({
  name: 'Todo',
  fields: () => ({
    id: {
      type: GraphQLID
    },
    action: {
      type: GraphQLString
    },
    isCompleted: {
      type: GraphQLBoolean
    },
    user: {
      type: UserType,
      resolve(parent, args) {
        return User.findById(parent.userId);
      }
    }
  })
});

Импортировано в файл.

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const todoSchema = new Schema({
  action: String,
  isCompleted: Boolean,
  userId: String
})

module.exports = mongoose.model('Todo', todoSchema);

Здесь находится репозиторий github, поэтому вы можете посмотреть код https://github.com/petersrule/graphql-node-express-boilerplate

1 Ответ

0 голосов
/ 23 декабря 2018

Пожалуйста, попробуйте использовать ниже обновленный код в функции распознавателя для обновления, "{new: true}" помогает вернуть обновленный объект из mongoDB.Я надеюсь, что это поможет.

updateTodo: {
  type: TodoType,
   args: {
     id: {
      type: new GraphQLNonNull(GraphQLID)
     },
     action: {
      type: new GraphQLNonNull(GraphQLString)
     }
   },
 resolve(parent, args) {
    return new Promise((resolve, reject) => {
        Todo.findOneAndUpdate({ // updateOne is a MongoDB/mongoose function
            "_id": args.id
          }, {
            $set: {
              "action": args.action
            }
          }, {
            new: true // This makes sure the return result is the updated information
          })
          .then((result) => {
            return resolve(result);
          })
          .catch((err) => {
            return reject(err);
          })
      })
      .then((finalResult) => {
        return finalResult;
      })
      .catch((err) => {
        return err;
      })
  }
}

Пожалуйста, дайте мне знать результат.

...