ошибка мангуста: обнаружена циклическая зависимость

avatar
Murat Colyaran
1 июля 2021 в 17:26
1130
1
1

Я написал сервис, который анализирует видео с помощью Google Cloud Video Intelligence

И я сохраняю результаты анализа в MongoDB с помощью mongoose

Это модель, которую я использую (я упростил все, чтобы избежать путаницы):

// Video.js

const mongoose = require('mongoose');

const videoSchema = new mongoose.Schema({
    analysis_progress: {
        percent: { type: Number, required: true },
        details: {}
    },
    status: {
        type: String,
        enum: ['idle', 'processing', 'done', 'failed'],
        default: 'idle'
    }
});

module.exports = mongoose.model('Video', videoSchema);

Когда операция анализа заканчивается, я вызываю функцию ниже и запускаю update следующим образом:


function detectFaces(video, results) {
   //Build query
    let update = {
        $set: {
            'analysis_results.face_annotations': results.faceDetectionAnnotations // results is the the test result
        }
    };

    Video.findOneAndUpdate({ _id: video._id }, update, { new: true }, (err, result) => {
        if (!err)
            return console.log("Succesfully saved faces annotiations:", video._id);
        throw err // This is the line error thrown
    });
}

И это ошибка, которую я получаю:

Error: cyclic dependency detected
    at serializeObject (C:\Users\murat\OneDrive\Masaüstü\bycape\media-analysis-api\node_modules\bson\lib\bson\parser\serializer.js:333:34)
    at serializeInto (C:\Users\murat\OneDrive\Masaüstü\bycape\media-analysis-api\node_modules\bson\lib\bson\parser\serializer.js:947:17)
...

Решения, которые я пробовал:

  1. Добавлено {autoIndex: false} в конфигурацию БД.
mongoose.connect(process.env.DB_CONNECTION, {useNewUrlParser: true, useUnifiedTopology: true, useFindAndModify: false, autoIndex: false });
  1. Удаление retryWrites=true из структуры Mongo URI. (У меня уже не было этого параметра в моем URI подключения)

Итак, я думаю, что источник проблемы в том, что я сохраняю весь результат теста, но у меня нет другой возможности сделать это. Мне нужно сохранить как есть.

Я открыт для любых предложений.

Источник

Ответы (1)

avatar
Murat Colyaran
2 июля 2021 в 10:31
3

Как я и предполагал, проблема заключалась в том, что в объекте, который пришел ко мне из Google, был cyclic dependency.

С помощью моего коллеги:

Затем, поскольку JSON.stringify() изменяет объект на простые типы: строка, число, массив, объект, логическое значение не может храниться ссылки на объекты для этого с помощью stringify, а затем проанализируйте вас уничтожить информацию, которую stringify не может преобразовать.

Другим способом было бы узнать, какое поле содержит циклическую ссылку и затем отключите или удалите это поле.

Я не смог найти, какое поле имеет cycylic dependency, поэтому я использовал I JSON.stringfy() и JSON.parse(), чтобы удалить его.

let videoAnnotiations = JSON.stringify(operationResult.annotationResults[0]);
videoAnnotiations = JSON.parse(videoAnnotiations);