Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] função populate do mongoose

estou tentando usar a função populate no postman mas n funciona

model de produto:

const mongoose = require('mongoose');
const { Schema } = require('mongoose');

const produtoSchema = new Schema({
    id: {
        type: String
    },
    nome: {
        type: String,
        require: true
    },
    fornecedor:[{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Fornecedores'
    }],
    preco: {
      type: Number,
      require: true
    },
    quantidade: {
        type: Number,
        require: true
    }
});

const Produtos = mongoose.model('Produtos', produtoSchema);

module.exports = Produtos;

Model de Fornecedor:

const mongoose = require('mongoose');
const { Schema } = require('mongoose');

const fornecedorSchema = new Schema({
    id: {
        type: String
    },
    nome: {
        type: String,
        require: true
    },
    contatoInfo: {
        type: String,
        require: true,
    
    }
});

const Fornecedores = mongoose.model('Fornecedores', fornecedorSchema);

module.exports = Fornecedores;

meu appj.js

require('dotenv').config();
const express = require('express');
const mongoose = require('mongoose');
const Fornecedores = require('./models/Fornecedor');
const Produtos = require('./models/Produto');

const app = express();

mongoose.connect(process.env.MONGO_URI, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
}).then(() => {
    console.log('Connect to database');
}).catch((error) => {
    console.log('MongoDB connection error:', error);
});

app.use(express.json());

app.post('/fornecedor', async (req, res) => {
    const { nome, contatoInfo } = req.body;

    try {
        const fornecedor = await Fornecedores.create({nome, contatoInfo});
        return res.status(201).json(fornecedor);
    } catch (error) {
        return res.status(500).json({ message: error.message });
    }
});

app.post('/produto', async (req, res) => {
    const { nome, fornecedor, preco, quantidade} = req.body;

    try {
        const produto = await Produtos.create({ nome, fornecedor, preco, quantidade});
        return res.status(201).json(produto);
    } catch (error) {
        return res.status(500).json({message: error.message});
    }
});

app.get('/produto', async (req, res) => {
    try {
        const data = await Produtos.findOne({name: 'notebook'}).populate({
            path: 'fornecedore'
        });
        return res.status(200).json(data);
    } catch (error) {
        return res.status(500).json({message: error.message})
    }
});

app.listen(process.env.PORT, () => {
    console.log(`servidor rodando na porta ${process.env.PORT}`);
});

Ja tentei de todas as formas que encontrei na internet, mas nada funciona

1 resposta
solução!

Olá, Higor

Pelo que pude analisar no seu código, parece que você está tentando popular o campo "fornecedore" na sua consulta GET, mas o nome correto do campo no seu schema de produto é "fornecedor". Isso pode estar causando o problema.

Além disso, ao criar um produto, você precisa garantir que está passando um ObjectId válido de um fornecedor existente para o campo "fornecedor".

Aqui está um exemplo corrigido do seu código:

app.post('/produto', async (req, res) => {
    const { nome, fornecedor, preco, quantidade} = req.body;

    try {
        const fornecedorExistente = await Fornecedores.findById(fornecedor);
        if (!fornecedorExistente) {
            return res.status(404).json({message: "Fornecedor não encontrado"});
        }
        const produto = await Produtos.create({ nome, fornecedor, preco, quantidade});
        return res.status(201).json(produto);
    } catch (error) {
        return res.status(500).json({message: error.message});
    }
});

app.get('/produto', async (req, res) => {
    try {
        const data = await Produtos.findOne({nome: 'notebook'}).populate('fornecedor');
        return res.status(200).json(data);
    } catch (error) {
        return res.status(500).json({message: error.message})
    }
});

Nesse exemplo, eu primeiro verifico se o fornecedor existe antes de criar o produto. Além disso, corrigi o nome do campo que você quer popular na consulta GET para 'fornecedor'.

Espero ter ajudado e bons estudos!