猫鼬 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的主要内容,如果未能解决你的问题,请参考以下文章