[API NodeJS + Express + Mongo] CRUD e relacionamentos com MongoDB | Diego Fernandes
ฝัง
- เผยแพร่เมื่อ 12 ธ.ค. 2024
- A série API NodeJS ensina do zero à criar uma API REST com NodeJS, Express e MongoDB.
Nesse vídeo nós criamos os models e relacionamentos entre usuários, projetos e tarefas. Também criamos todas operações CRUD de projetos e tarefas.
-----
Acompanhe a Rocketseat nas redes sociais:
Site: www.rocketseat...
Twitter: / rocketseat
Facebook: / rocketseat
Instagram: / rocketseat_oficial
Comunidade: comunidade.rock...
Blog: rocketseat.com...
Queria tanto que essa série tivesse continuado... Ou quem sabe ser refeita, já que algumas coisas que foram feitas no vídeo já não são mais do mesmo jeito. Pra quem nunca fez uma api na vida e não tem ideia de como é o processo de desenvolver uma, é tão tão útil poder acompanhar o desenvolvimento de um projeto completo assim (Login/autenticação/autorização/CRUD), e se tivesse uma outra série voltada pro front consumindo essa API seria ainda melhor.
Man não abandona essa serie não.. ta muito massa!
Ensinar sobre autorização seria uma boa! vlws!
rocketseat é um carimbo de qualidade para qualquer tipo de aplicação prática! DIEGÃO FALANDO DEVAGAR É ATÉ ESTRANHO kkkkkkkk
Cara vou até deixar um comentário aqui, tenho uma entrega amanhã e esse vídeo simplesmente ME SALVOU!
Infelizmente eu não to fazendo minha API colocando as rotas no controller, elas estão em um arquivo separado e isso dificultou um tanto meu entendimento, mas depois de alguns testes consegui fazer rodar corretamente. Se alguém tiver arquivos separados para routes e controllers, só o fato de eles estarem conectados (export/import) basta para usar apenas o route.use(authMiddleware) e, no controller, utilizar os recursos authMiddleware, como o id do usuário.
Feliz por ter chegado até aqui, vamos lá, eu conseguir programar tudo, alguns erros que foram aparecendo com paciência eu conseguir resolver sozinho, fiz algumas mudanças em relação ao servidor, tem muita coisa que não entendi, mas consigo explicar todo o projeto, acredito que eu não conseguiria fazer sozinho, ou passaria por muitas dificuldades e demandaria tempo, mas eu também não tenho muito tempo de node, e foi o meu primeiro contato com mongodb. As vezes eu acho que só sei fazer olhando, a sindrome do impostor, mas acredito que como eu sei explicar e consigo fazer as rotas eu não estou tão ruim, apenas não sei tudo é tá tudo bem, ao poucos espero melhorar. Obrigado Diego e Rocketseat por tudo.
Pena a série ter acabado, mas foi de grande valia!
Muito boa!
Obrigado por compartilhar o seu conhecimento!
Sugestão para continuação da série, ter permissão de acesso para algumas coisa e outras não, com perfil de usuário, e isso nos dará mais detalhadamente sobre o uso de middlewares em Node.js.
A série está muito boa parabéns!!!
Não abandona ela não man...
Muito obrigado por todo conteúdo, Diego!
Comecei há pouco tempo com node e estou gostando muito graças a semana omnistack 11!
Acompanhei agora estas aulas e senti falta do frontend.
grande abraço!
E novamente você salvou meu TCC, Obrigado Diego!!!
Qual curso, men ?
Diego, suas aulas são muito didáticas, gostei muito, e consegui adquirir varias informações e aprendizados em relação ano nodejs
Cara, perfeito! Parabéns pelo curso. Tens uma excelente didática e já compartilhei a Rocketseat aqui com a galera da empresa. Me ajudou e muito para um teste que estou fazendo. Obrigado! :)
to revendo os video e acho que finalmente entendi e aprendi ja to fazendo sozinho, obrigado pelo conteudo
Serie salvadora, me ajudou muito a começar um backend em node
Muito obrigado, Diego! Abraços! Fiz pequenas alterações. Na parte para remover o project, foi sugerido pelo mongoose substituir o remove por deleteMany. Ficou assim: await Task.deleteMany({ project: project._id });
Gostei bastante da série, parabéns! Sua didática é excelente. Espero que não tenha abandonado de vez.
Diego, muito boa as aulas dessa série. Estou começando agora com Nodejs e realmente os exemplos ajudaram muito. Obrigado.
Aguardo os próximos vídeos!!
Parabéns para você e ao pessoal do Rocketseat.
massa de mais, peno 2020 e tudo roda certinho, só fiz mudanças de acordo com versionamento, vlw rocket
Boaa Matheus!! 🚀💜
ahooo, muito top mano !! Pra ficar melhor, só faltou a continuação ;(
Diego, parabéns pelo conteúdo! Está me ajudando e garanto que irá ajudar mais dev. Faz um video tb falando sobre autorização, exemplo ter um usuário admin que consiga listar todas tasks de um determinado usuário.
A série está excelente! Continua com ela, por favor...
Se for possível, aplica a api em um app feito em ionic nos próximos vídeos.
Obrigado, tamo junto!
Excelente !!! Consegui acompanhar as aulas. Apenas o método findByIdAndUpdate(...) está aparecendo um DeprecationWarning. Essa foi a série que mais gostei parabens !!!!
na conexão com o db seta esse parametro useFindAndModify: false, pode colocar abaixo do useNewUrlParser.
@@babifashiol MUITO OBRIGADO!! estou fazendo um desafio pra uma vaga e estou fazendo com mongo, estava dando esse erro, muito obrigado mesmo
Já agradeci no outro vídeo, mas agradeço novamente, essa série me ajudou muito
Fala Marcelo! Valeeeu pelo feedback! 💜
Muito show esta série, estou usando como exemplo para a necessidade de um projeto meu de um ecommerce e fica minha sugestão de uma nova série de projeto nodejs com aws, pagseguro e dois niveis para categorias. Ex: categoria-pai > categoria-filha > produto. Se puder ajudar posso postar aqui minhas dificuldades. Abração, vlw pela didática, simples, clara e objetiva. Sucesso pra nós!
Muito bom, só o lance do banco que deu dor de cabeça para entender, mas , foi tudo bem proveitoso. Obrigado.
Parabéns pelo ótimo material, Diego!!!
Diego, sensacional os vídeos, muito bem explicado! Me ajudou muito, como estou aprendendo node agora, me tirou várias dúvidas. Vlws!
Obrigado por este video, tenho aprendido muito!!!!!!
Fala Diego... beleza... cara muito bom os vídeos... não abandona a série não.... to aprendendo muito... obrigado...
Poderia trazer algum outro vídeo onde teria a autenticação a API sendo uma aplicação e não um usuário do sistema... qual a melhor forma de fazer isso...
Fala Ricardo! Na verdade a séria foi pausada haha, mas temos outros conteúdos atualizados no canal que podem te ajudar já 💜
PARABENS pela serie, fala sobre paginação.
Muito bom, conteúdo de qualidade
Está animal essa séria, poderia adicionar uma aula com Login com alguma lib de Facebook ou Google
Muito bom eu adorei a vídeo aula!!!
Terminei o projeto e está funcionando:
github.com/Daniel-Vinicius/api-node-jwt.git
Boaaa Daniel! 🚀
@@rocketseat Valeu Por disponibilizar esse conteúdo massa de graça!
vi seu projeto para ver o que tinha errado no meu, vlw man.
@@blablablabla-mj2rn Eu que agradeço de poder ajudar alguém, procurei alguém pra fazer isso que você fez e não achei, então pensei porque não ser o primeiro?
@@danielvinicius4906 exatamente, eu também estou colocando os projetos da Rocket no meu GitHub, além dos meu projetos pessoais.
Muito bacana essa série! Queria ver um exemplo usando o conceito de Resository com injeção de dependência. Para ficar fácil alternar entre bancos, caso seja necessário. Por exemplo: A aplicação poderia ter alguns repositórios salvando em mongo, como notificações e mensagens, e ter alguns repositórios salvando em MYSQL.
Fala Julian, beleza? Com certeza, acho que esse é um tópico um pouco mais avançado e infelizmente não cabe nessa série pois estou direcionado ela para quem é realmente cru em NodeJS e quer criar API's, mas ótima sugestão para próximos assuntos.
Muito boa essa série! Descomplicou uma pá de coisas, obrigado!
sua aula tá sensacional, só recomendo que de uma olhada melhor nos relacionamentos com MongoDB.
it's done...
muito bom obrigado Rocket.!!!
Fala Robson! Valeeeeu 💜💜
Excelente conteudo!! parabens pelas aulas
Diego!! seria possível criar umas aulas sobre NodeJS + Express + MySQL/PostgreSQL??? seria uma boa... sugestão..
Fala Marcelo, tenho em mente sim :) Valeu!
Meio atrasado kkkkk, mais o express não cola muito com bancos relacionais (minha opinião/nada contra também), recomendo AdonisJS para banco relacional, é muito intuitivo, produtivo e de fácil aprendizagem. Inclusive tem vídeo aqui no canal da Rocketseat.
Zoelner car, vou dar uma olhada uma pra dessas! Valeu!
Pra esses bancos sugiro sequelize...
@@JulioCesardaSilvaBarros Acho que é totalmente viável utilizar Express, na verdade eu não vejo muita relação de prós ou contras.
Vlw Rocket! So um detalhe no delete, se passar um id que nao existe ele esta dando mensagem de sucesso mesmo assim, teria verificar se o findbyidandremove eh diferente de null pra dar a mensagem de sucesso se nao erro
Diego, poderias fazer uma aula conectando a aplicação nodejs com angular?Obrigada!!!
Cara, suas aulas são muito boas! Está de parabéns! Me ajudou muito. Por favor, poderia voltar a fazer vídeos sobre esta série? Obrigado!
Fala Fabio, logo liberarei um material com mais aulas gratuitamente em nosso site.
Muito boa a aula
qual seria o correto quando tô criando os Schemas, colocar como require ou required? Pois na criação dos projects enquanto não estava preenchendo com o user dava erro pq tava requireD, mas se mudasse pra require dava certo.
Excelente vídeo aula ✌️
Aprendi muito com as aulas, muito bom esse curso, Diego você é um ótimo professor... Cheguei até o final e infelizmente estou com um erro:
Não consigo atualizar o documento todo... As tasks são deletadas da tabela tasks e as novas tasks não são adicionadas com o update. Na tabela project elas não são deletadas e nem atualizadas. O seguinte erro aparece no servido:
TypeError: Cannot read property 'map' of undefined
at router.put (/home/adriano/Cursos/Rocketseat/cursos/Api--Node-Express-Mongo/serie-node/src/app/controllers/projectController.js:70:33)
at process._tickCallback (internal/process/next_tick.js:68:7)
Alguém teve esse problema e conseguiu resolver?
Prefeito, só um acréscimo,uma API que pega dados de várias APIs de moedas digitais como bitcoin, existem muitas delas é isso seria legal em um market placer aberto para negociação e coisas do tipo,algo mais amplo do que os dados de cotação ou gráficos q tem muitos serviços já disponíveis,de qualquer forma seria muito útil para a comunidade local de negocia essa criptomoedas digitais.Abraco muita luz
Você poderia mostrar como colocar esse projeto em um servidor, seria uma boa continuidade.
Legal Diego. Não sei se foi citado por alguém ou não, mas no update do projeto, não seria certo também atualizar o user também ? Ou este campo registra apenas o usuário que criou o projeto ? Ah, seus vídeos são excelentes !!! Grande abraço.
Show de bola
Que massa que curtiu, Wanderson! 💜 😍
Boa noite, parabéns pela videoaula, muito boa. Tenho uma dúvida a respeito de relacionamento, se por exemplo eu fosse fazer um usuario criar vários eventos, pelo que entendi é necessário criar um ref no usuário, de um model por exemplo evento como array, e no model de evento colocar um assignedTo do user? aproveito o embalo para perguntar também, se no post no callback eu passaria userId? cara mongo é rápido, mas ta loco, eu to me batendo nesses relacionamentos kkkk
Muitos bons vídeos, da pra fazer um vídeo da API sendo consumida por ReactJs? Vlw man
QUando sai a próxima aula??? a série tá ótima vlw
Fala Fabio, estamos lançando vídeos pra mais séries então nem sempre sai toda semana, mas fica ligado aí que logo sai o próximo
@@rocketseat Faz 3 anos desde esse comentário...
Ótima aula
Muito bom. Valeu!
Fala Diego blz, cara realmente o mongo é show de bola, me diz uma coisa estou pra iniciar um novo projeto pra imobiliária neste caso vc indicaria o mongo ou é melhor por sua experiência usar relacional mesmo? Abraço e continue com seu canal ele é top
Só utilize bancos não-relacionais como o MongoDB em caso da sua base precisar armazenar MUITOS dados sem relacionamentos. Por exemplo para mensagens, notificações, etc... Mas para models comuns como imóvel, usuário, use banco relacional.
Valeu me salvou
Muito bom, Diego. Estava quebrando a cabeça por não saber que o mongooise não consegue dar save() com um documento que contivesse um array com outros models... mas estou com uma dificuldade aqui: como faço para fazer find filtrando pelos models que estão dentro de outro model.... por exemplo: tenho um documento "empresa" , nesse documento eu tenho n "Pessoas".... o model Pessoas possui as propriedades: nome e sexo . Então como eu faria para trazer uma ou mais pessoas de uma empresa X do sexo masculino, somente.
Onde tá a primeira aula?
Como você trabalha com bancos relacionais na condição de precisar fazer um rollback? Ex: Você tem uma tabela cliente e uma tabela de endereço desse cliente. Primeiramente você faz o insert do cliente para depois fazer o insert do endereço dele e caso aconteça algum erro no insert do endereço, você precisa fazer um rollback de tudo que você fez anteriormente. Como você faz esse tipo de situação com promisses? Estou utilizando mysql na minha aplicação, pois a aplicação possui muitos relacionamentos. Eu criei na camada de acesso a dados a abertura de uma transaction, porém no controller eu preciso ficar retornando sempre a transaction para passar para a próxima função e realizar commit ou rollback caso necessário.
Gostaria de saber se você já precisou fazer isso alguma vez, de trabalhar com relacionamentos de tabela e precisar fazer um rollback caso necessário e como você organizou o controller para que o código ficasse organizado, pelo fato de possuir funções a mais para realizar o insert em tabelas diferentes.
Grande abraço e parabéns pelo conteúdo.
essa serie não vai ter continuação?
Se eu quiser adicionar uma tarefa na lista na lista de tarefas de um determinado projeto, sem salvar outro projeto com as tarefas novas, o certo é eu atualizar o projeto com put e não salvar “em cima” do projeto atual ?
Existe algum GIT com esse projeto?
Para quem estiver tendo problema em 2023 ao executar o PUT para atualizar o registro, o Task.remove(...) não funciona mais, substitua por Task.deleteMany({ project: project._id }) que já resolve.
Esse código está em algum git?
Tenta fazer uma série, fazendo uma plataforma com gamification. Tendo Xp, badges, levels....
Diego no minuto 14:33, você adicionou uns 3 pontinhos em req.body, o que esses 3 pontinhos significa ?
Fala Iran, isso se chama rest/spread operator. Explico nesse curso gratuito aqui se tiver interesse: rocketseat.com.br/starter/curso-gratuito-javascript-es6
Ótimo vídeo, porem estou com um problema. Na hora de fazer a rota de update para os projetos o meu codigo está retornando este erro:
TypeError: Cannot read properties of undefined (reading 'map')
Na linha referente a função para cadastrar as tasks em um projeto atualizado. Poderiam me ajudar??
Você poderia disponibilizar o código no Git?
Uma dúvida... A propriedade "assingedTo" que recebe o id do usuário em Task, ela faz parte do processo de relacionamento ou seria só pra guardar quem criou? (Apesar de ter outra forma de consultar)...??? Obrigado!!!!
Seria parte do processo de relacionamento sim :)
Obrigado! Canal nota 10 👏
Pq não ocorre o erro de validação do User na criação do Project já que a propriedade é requerida? No meu teste se eu não mandar o ID do user no body do request não consigo criar os projetos
Continuação dessa serie pfv 2021 api rest com tudo que temos de direito
Como eu faço para que na requisição get ele apenas me retorne o ultimo registro que foi colocado(o mais recente)?
A propriedade `require` está digitada corretamente? Eu consultei a documentação, não seria `required`?
Aqui, eu estou com problema justamente por conta disso .
Quando vou postar um novo project com código abaixo no `./src/app/models/project.js` , me retorna um erro: Error: Project validation failed: user: Path `user` is required.
user: {
type: mongoose.Schema.Types.ObjectId,
ref: "User",
required: true,
},
Show!!
Valeeeu Victor! 💜💜
quem está tendo erro de remove is not a function, troca o remove por deleteOne
Tem videos aulas continuando com a autenticação jwt em ReactJS utilizando essa mesma API ou uma API semelhante???
Como eu faço o show mostrar por nome de projeto?
Sugestão, um video hello world api node com typescript
Faala Antônio! Esse vídeo é um pouco antigo, nos novos já usamos TypeScript em praticamente todos eles. Dá uma conferida nesse aqui, além de falarmos sobre patterns e arquitetura, também mostramos uma API sendo criada com Node.js e TypeScript já! 💜
dica para uma continuação, 2fa da google ou authy
Teria como disponibilizar o código ?
Há possibilidade de dar umas dicas de como migrar esse projeto para um banco relacional?
Fala Magnaldo, dá uma olhada nesse post: blog.rocketseat.com.br/nodejs-express-sequelize/
@@rocketseat Exatamente isso. Show!
Diego!! estou escrevendo teu código, assim consigo gravar e aprender mais, bem cheguei na etapa do projeto 24:35, e ao executar insomnia, ao criar um novo projeto, recebo a mensagem de erro, vou no console do node e recebo esta mensagem: "TypeError: Cannot read property 'map' of undefined
at router.post (/Users/mavo/Desktop/appMavo/RocketseatCode/serie-node/src/app/controllers/projectController.js:40:33)
at
at process._tickCallback (internal/process/next_tick.js:188:7)"
pelo que entendi, esta dizendo que a propriedade map não esta definida. segue parte do código..
"// Route para criar um novo Projeto.
router.post('/', async (req, res) => {
try {
const { title, description, tasks } = req.body;
const project = await Project.create({ title, description, user: req.userId });
await Promise.all(tasks.map( async task => {
const projectTask = new Task({ ...task, project: project._id });
await projectTask.save();
project.tasks.push(projectTask);
}));
await project.save();
return res.send({ project });
} catch(err) {
console.log(err);
return res.status(400).send({ error: 'Error creating new project' });
}
});"
Você está enviando as tasks pelo Insomnia no corpo da requisição? Me chame lá na comunidade pra eu te ajudar Marcelo (comunidade.rocketseat.com.br). Abraço!
entrando no discord
Marcelo Olate Estou com esse mesmo problema, como você resolveu ?
Fransico!! me recordo vagamente, mas acredito que seja algo com os nomes das variaveis... sao muito parecidas... verifica as variaveis tasks em todos os modulos... vou abrir o projeto aqui... e ja te digo algo... mas o caminho é esse "tasks"
Junior eu também fiz do ZERO, por isso tive esse problema... teu método não esta errado.. baixar e fazer um paralelo, porem acredito que se tiver um error vai cair no mesmo problema... e desculpas não ter respondido antes... na próxima fico mais atento..
Alguém link aqui a continuação >.
Eae Diegão, blz? essas aulas ainda estão atualizadas? posso confiar kk, muit obrigado por todo conteúdo! vlw.
Faala, Luís! O vídeo é antigo, então é provável que esteja desatualizado. 💜💜
eu fiz e foi de boas, testei com as versões do vídeo e as mais novas, porém, tem que dar uma pesquisada se der erros pq as libs se atualizaram, caso mesmo é o do handlebars nas configs de template
Cara, blz?
Eu tava consumindo api do wordpress. os textos ficaram certos, mas as imagens vindo no html ficaram bem bugadas. Tem alguma forma de tratar isso?
As respostas das minhas requisições nunca trazem o id do usuário, alguém sabe qual pode ser o motivo ?
Estou tendo erro de validação no user do model Project porque ele é required e o mongoose.Schema.Types.ObjectId está retornando undefined
alguém teve este problema?
user:{
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
required: true
},
acho que vc deveria ter usado "require" e não "required"
TOP
Diego seria possível fazer NodeJS + Express + MySQL ?
Claro Jairo, você diz em vídeo? Nesse caso é só trocar o Mongoose pelo Sequelize ou pelo Bookshelf. Abração!
@@rocketseat sim em vídeo. Se possível com relacionamento entre tabelas
Para quem estava acompanhando os outros tutoriais da serie e esta com erro Unknown modifier: $pushAll
Você precisa instalar a versão atualizada do mongoose (yarn add mongoose).
Na verdade, o erro persiste quando se instala um versão mais nova do mongoose, o que funcionou aqui foi adicionar a opção "{usePushEach: true}" após a definição das propriedades do objeto, como no exemplo abaixo.
const mongoose = require('../../database');
const bcrypt = require('bcryptjs');
const ProjectSchema = new mongoose.Schema(
{
title: {
type: String,
require: true
},
description: {
type: String,
require: true
},
user: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
require: true
},
tasks: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Task'
}],
createdAt: {
type: Date,
default: Date.now
},
},
{
usePushEach: true
}
);
const Project = mongoose.model('Project', ProjectSchema);
module.exports = Project;
Qual versão do mongoose está usando?
version v3.6.2
está instrução: mongoose.Schema.Types.ObjectId ta dando undefined pra mim seria por causa da versão que estou usando do mongoose? uso a versão 5.0.0-rc2
Testei aqui usando a versão que tu usa mas não rola, mesmo usando esse parametro ai {usePushEach: true}, retorna project: false pra mim.
Em 11:38 ele diz : " user: ValidatorError: Path `user` is required."
Isso aconteceu porque vc colocou o "required" e não "require" no model do projeto, e está certo assim, depois quando ele ensina a agregar o Id do usuário, o código passa a funcionar
Diego tudo joia? Mais 1 inscrito parabens pelo canal.
Gostaria de saber se seria possivel a criançao de uma api simples utilizando graphql knex express and react?
Fala Victor, em breve vamos postar mais conteúdo sobre GraphQL. Recomendo muito utilizar um ORM por cima do Knex como o Bookshelf. Abração!
Assisti um mini curso seu ensinando a fazer um app. Eu gostei muito dele, me interessei nisso. Só que tem um problema :/ eu não sei nada sobre todos esses comandos, não sei nada.
No início da sua carreira, como você aprendeu a criar ?
Gostaria muito de aprender isso. Você sabe como eu, iniciante, posso aprender a criar aplicativos do zero?
Obs: eu não sei falar ou idioma
Fala Edu, você precisa começar do zero mesmo, recomendo começar com linguagens mais básicas como PHP e Javascript puros. O NodeJS já é uma linguagem um pouco mais avançada, soma muitos conceitos em um só local. Se precisar de recomendações de conteúdo, entra lá na comunidade (comunidade.rocketseat.com.br) que o pessoal te ajuda :)
oi, qundo tento usar o create aparece isso no console.log(err) Error [ValidationError]: Project validation failed: user: Path `user` is required.
resolveu?
O meu tbm.
O meu também!
Ajuda aí galera
@@williamandrade6627 ajuda aí por favor
Alguém poderia me ajudar ? Preciso utilizar essa mesma estrutura de código que ele utilizou no video, porem usando o Mysql, alguem poderia me dizer se é possível e como fazer ? kkk, sou iniciante na area.
hey man, na paz??
No 14:25, ao adicionar "const project = await Project.create({ ...req.body, user: req.userId })", me da o seguinte erro no terminal:
SyntaxError: Unexpected token ...
sabe o que pode ser??
vlw
Pode ser a versão do node que vc ta usando. Parece que o ... não foi reconhecido, esta nova funcionalidade do javascript só foi adicionada nas ultimas versões. Tenta atualizar pra ultima versão, talvez resolva. Tchau brigadu
Verifica se adicionou o async antes do (req,res).
O que significa aqueles ... no inicio do req.body?
Fala Ricardo, isso se chama desestruturação e é uma feature para copiar informações de arrays e objetos.
Mas Diego, o Mongo é conhecido pela redundância de dados, por que esta fazendo relacionamentos?
Isso que eu me pergunto, não sou grande conhecedor de noSQL, mas não daria pra criar collection dentro de um documento, tipo ali nas tasks, é uma collection dentro do documento