猫鼬 findOne 方法返回 null

Posted

技术标签:

【中文标题】猫鼬 findOne 方法返回 null【英文标题】:mongoose findOne method is returning 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 已经有了,请检查编辑。 【参考方案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 尝试,但在运行任何查询时它仍然给我同样的错误。

以上是关于猫鼬 findOne 方法返回 null的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬 findOne :异步和同步之间的不同

节点猫鼬总是在 findOne 上返回错误

猫鼬我如何返回 findOne 数据对象

猫鼬中的 findOne 返回空对象,然后返回正确的对象

猫鼬 findOne,更新和执行

无法访问从猫鼬fineOne()返回的json中的键[重复]