删除变异不起作用

时间:2017-07-25 23:52:29

标签: mongodb mongoose

我从graphql开始,我正在尝试删除graphql中的节点,但我没有得到它。

这是我的解析器:

export default {
  Query: {
    allLinks: async (root, data, { mongo: { Links } }) =>
      Links.find({}).toArray()
  },
  Mutation: {
    createLink: async (root, data, { mongo: { Links }, user }) => {
      const newLink = Object.assign({ postedById: user && user._id }, data);
      const response = await Links.insert(newLink);
      return Object.assign({ id: response.insertedIds[0] }, newLink);
    },
    removeLink: async (root, { id }, { mongo: { Links }, user }) => {
      const newLink = Object.assign({ postedById: user && user._id });
      const response = await Links.remove(id);
      return Object.assign(response, newLink);
    },
    createUser: async (root, data, { mongo: { Users } }) => {
      const newUser = {
        name: data.name,
        email: data.authProvider.email.email,
        password: data.authProvider.email.password
      };
      const response = await Users.insert(newUser);
      return Object.assign({ id: response.insertedIds[0] }, newUser);
    },
    signinUser: async (root, data, { mongo: { Users } }) => {
      const user = await Users.findOne({ email: data.email.email });
      if (data.email.password === user.password) {
        return { token: `token-${user.email}`, user };
      }
    }
  },

  Link: {
    id: root => root._id || root.id,
    postedBy: async ({ postedById }, data, { dataloaders: { userLoader } }) => {
      return await userLoader.load(postedById);
    }
  },
  User: {
    id: root => root._id || root.id
  }
};

所有突变都正常工作,而不是removeLink。

当我运行removeLink变异时,我收到了这个错误:

  

MongoError:'q'的类型错误。期待一个对象,得到一个字符串。

我知道有些事情是错的,但我不知道是什么。

2 个答案:

答案 0 :(得分:1)

您应该使用deleteOne()代替remove(),因为remove()已被弃用。也没有任何理由发回您最近删除的链接。

尝试这样的事情(不要知道你的其余代码,所以我无法测试它):

removeLink: async (root, { id }, { mongo: { Links }, user }) => {
  return await Links.deleteOne({ id });
},

如果您仍想要返回已删除的链接:

removeLink: async (root, { id }, { mongo: { Links }, user }) => {
  const newLink = Object.assign({ postedById: user && user._id });
  const response = await Links.deleteOne({ id });
  return Object.assign(response, newLink);
},

答案 1 :(得分:0)

你的问题似乎与你如何使用MongoDB而不是GraphQL有关。如果您查看the docs for the Collection.remove()方法,您会发现您可以将其称为"查询" Mongo将删除所有符合条件的项目。

在您的情况下,您的查询似乎无效。您传递的是字符串id,但您应该将对象{ id: <some value> }传递给它。我认为你想要的那条线是:

const response = await Links.remove({ id: id});