-1

尝试在 MongoDB 上推送新数据时出现错误“超出最大序列化深度”。当使用 MongoDB Community 在 localhost 上进行单元测试时,它可以正常工作。任何帮助,将不胜感激。我也没有看到循环参考。

这是开始保存数据的功能。首先到我的本地缓存,然后到云(MongoDB)。

///Calling function
public async Task AddComment(Range item, Comment commentItem)
{
    try
    {
        //Save to local cache
        item.Comments.Add(commentItem);

        //Next save to cloud
        await CloudStorage.AddComment(item.User.ID, item.ID, commentItem);
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex);
    }
}

//-->ERROR HAPPENS LAST LINE HERE<--
public async Task<UpdateResult> AddComment(string ownerID, string rangeID, Comment comment)
{
    var filter = Builders<User>.Filter.Where(u => u.ID == ownerID &&
                                                  u.Content.Any(i => i.ID == rangeID));
    var update = Builders<User>.Update.Push(c => c.Content[-1].Comments, comment);
    return await collection.UpdateOneAsync(filter, update); //<- THIS THROWS ERROR
}

这是适用于 localhost 的单元测试。

[TestMethod]
public void TestInsertComment()
{
    //Arrange
    var owner = "OWNER";

    var ownerData = collection.Find(u => u.Username.Equals(owner)).FirstOrDefault();
    var ownerID = ownerData?.ID;
    var range = ownerData?.Content.FirstOrDefault();

    var newComment = new Comment
    {
        User = range?.User,
        Content = "Some comment",
        IsLive = true
    };

    //Act
    var results = _cloudStorageService.AddComment(ownerID, range?.ID, newComment);
    results.Wait();

    var insertedID = collection.Find(u => u.Username.Equals(owner))
                               .FirstOrDefault().Content.FirstOrDefault()?
                               .Comments.FirstOrDefault(c => c.ID.Equals(newComment.ID))?.ID;

    //Assert
    Assert.AreEqual(newComment.ID, insertedID);
}

更新:我注意到的一件事是,如果同一用户尝试向他们的范围添加评论,那是唯一发生此错误的时间。如果另一个用户添加评论,它工作得很好。并且无论是同一个用户还是其他用户,单元测试都可以正常工作。

4

1 回答 1

-1

哇!

所以我决定摆脱我遇到的错误并执行代码清理。这样做时,我偶然发现了一个我已经忽略了一段时间的清理项目,即从代码中删除所有 SomeAsyncTask.Wait() 引用并替换为 await SomeAsyncTask。在这样做的过程中,我发现了这个小块:

var commentItem = new Comment
{
    User = GetCurrentUserExtData(),
    Content = NewCommentText
}

public User GetCurrentUserExtData(string ID = null)
{
    var user = new User();
    var data = DataStore.GetUser(ID);
    data.Wait();
    user = data.Result;

    return user;
}

GetCurrentUserExtData 中有 SomeAsyncTask.Wait() 任务。将其更改为:

var commentItem = new Comment
{
    Content = NewCommentText,
    User = await DataStore.GetUser()
}

并且没有更多的最大序列化深度超出错误!我根本不认为这会相关,但它是!不用说,如果使用异步方法,请删除所有 .WAIT() 引用并找到一种使用 await 的方法。

于 2018-05-02T04:10:18.923 回答