【问题标题】:mongoose findOne method is returning null猫鼬 findOne 方法返回 null
【发布时间】:2019-03-25 10:53:27
【问题描述】:

我正在关注this 教程。尽管代码正是本教程中提到的,但每次我运行 graphql 变异查询来更新特定推文时,它都会返回 null 并在 cmd 上记录 null

我验证了 mongoose 版本是相同的 (4.11.3)。我相信 findOne 方法有问题,即使在 deleteTweet 解析器中,findOne 正在返回 null。是因为 findOne 需要回调吗?但在教程中没有通过回调。我还注意到 findOneAndUpdate 工作正常,但它会创建一个新条目而不是更新现有的推文。

  updateTweet: async (_, { id, ...rest}, { user }) => {
    try {
      await requireAuth(user)
      const tweet = await Tweet.findOne({ id, user: user.id });
      console.log(tweet);

      if(!tweet) {
        throw new Error('Not Found!');
      }

      return tweet.save();

    } catch (e) {
      throw e;
    }
  },


  deleteTweet: async (_, { id }, { user }) => {
    try {
      await requireAuth(user);
      const tweet = await Tweet.findOne({ id, user: user.id });

      if(!tweet) {
        throw new Error('Not Found !')
      }

      await tweet.remove();
      return {
        message: "Deleted Tweet Successfully"
      }
    }catch(error) {
      throw error;
    }
  }
}

TweetSchema

import mongoose, { Schema } from 'mongoose';

const TweetSchema = new Schema({
  text: {
   type: String,
   minlength: [5, 'Text need to be longer'],
   maxlength: [144, 'Text is too long'],
 },
  user: {
    type: Schema.Types.ObjectId,
    ref: 'User'
  },
  favoriteCount: {
    type: Number,
    default: 0
  }
}, { timestamps: true})

export default mongoose.model('Tweet', TweetSchema);

【问题讨论】:

  • 什么是id?它的价值是什么?
  • Id 由 graphql 生成并存储在 mongodb 上的推文集合中 这是在 graphiql 上运行更新查询后记录的内容 tweets.findOne({ user: ObjectId("5bcbcac57870760db4ff34ab"), id: '5bcbcac57870760db4ff34ab '}, {fields: {} })null
  • 所以你的 id 需要是ObjectId(id)
  • Tweet.findOne({ id: mongo.ObjectID(id), user: user.id })
  • 但是 TweetSchema 已经有了,请检查编辑。

标签: reactjs mongodb mongoose graphql


【解决方案1】:

你有一个错字。在 MongoDB 中,关键字段是 _id 而不是 id。这是由 MongoDB 自动添加的,除非提供,因此您需要将代码更改为使用 _id。

【讨论】:

  • 不,我确定问题不在于 id,因为我有一个 getTweet 解析器,例如 getTweet: async (, { id }, { user }) => { try {等待要求身份验证(用户);返回 Tweet.findById(id); } 抓住 (e) { 抛出 e; } } 结果很好,我也试过 _id 但没用。
  • findById 不接受对象,它接受实际值。因此,当您执行 findById(id) 时,它与 findOne({ id }) 不同,因为后者会错误地使用键名 id
  • 如果把updateTweet中的代码改成: const tweet = await Tweet.findOne({ _id: id, user: user.id }); // 如果那是一个 db 对象,它可能还需要是 user._id。这行得通吗?
  • 感谢您的信息!我知道关键字段是 _id 但是当我最初使用 _id 进行设置时,它给了我一些错误““ID 不能代表值:{ _bsontype: \"ObjectID\"" 这就是为什么我在任何地方都将 _id 更改为 id,是吗有所作为?
  • 刚才我将所有 id 更改为 _id 尝试,但在运行任何查询时它仍然给我同样的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-13
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多