Почему я получаю ошибку «Превышен максимальный размер стека вызовов»?

#javascript #express

Вопрос:

Новичок здесь, и я не понимаю, почему я получаю ошибку максимального стека вызовов:

 app.post('/farms/:id/products', async (req, res) => {
    const { id } = req.params;
    const farm = await Farm.findById(id);
    const { name, price, category } = req.body;
    const newProduct = new Product({ name, price, category });
    newProduct.farm = farm;
    farm.products.push(newProduct);

    res.send(farm)
})
 

Я заметил, что если я переключусь на это, я больше не получу ошибку. Однако я не понимаю, почему это сработает.

 farm.products.push(newProduct);
newProduct.farm = farm;
 

Вот как я определил схему продукта:

 const productSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true
    },
    price: {
        type: Number,
        required: true,
        min: 0
    },
    category: {
        type: String,
        lowercase: true,
        enum: ['fruit', 'vegetable', 'dairy']
    },
    farm: {
        type: Schema.Types.ObjectId,
        ref: 'Farm'
    }
})

const Product = mongoose.model('Product', productSchema);
 

Вот как я определил схему фермы:

 const farmSchema = new mongoose.Schema({
    name: {
        type: String,
        required: [true, 'Farm must have a name!']
    },
    city: {
        type: String
    },
    email: {
        type: String,
        require: [true, 'Email is required!']
    },
    products: [{
        type: Schema.Types.ObjectId,
        ref: 'Product'
    }]
})

const Farm = mongoose.model('Farm', farmSchema);
 

Комментарии:

1. Если вы проверите трассировку стека, когда произойдет ошибка, вы сможете увидеть, где она попадает в цикл рекурсии.

2. Есть ли в Product классе farm задатчик для свойства? Я подозреваю, что проблема в этом.

3. Вы создали циклическую структуру ссылок, а не то, что будет сериализовано.. например, var a = {hello: 'hello'}; a.a = a; JSON.stringify(a) не удастся

4. @Кит, почему бы изменить порядок нажатия и назначения, чтобы исправить это?

5. @Keith Я думаю, что это должно вызвать другую ошибку в отношении циклических объектов.