Cursos / Informática para Internet / Desenvolvimento Backend / Aula

arrow_back Aula 08 - Upload de arquivos

Ajustando rota de validação


Para finalizar sobre o upload de arquivos, é essencial que esse upload feito seja armazenado no banco de dados para que a aplicação conheça a imagem e registre tudo corretamente.

Armazenando o arquivo no banco

Até o momento o upload está sendo feito, mas a aplicação mostra apenas uma mensagem informando o sucesso. Para fazer o armazenamento, acompanhe a aula alterando o arquivo posts.rota.js , que deve ficar de acordo com o modelo abaixo:

    const express = require('express')
    const router = express.Router()
    const postMid = require('../middleware/validarPost.middleware')
    const { Post, Usuario } = require('../db/models')
    var multer  = require('multer')
    const path = require('path')

    var storage = multer.diskStorage({
            destination: function (req, file, cb) {
                cb(null, 'public/uploads')
            },
            filename: function (req, file, cb) {
                 cb(null, file.fieldname + "-" + Date.now() + path.extname(file.originalname)) 
            }
    })

    const fileFilter = (req, file, cb) => {
            const extensoes = /jpeg|jpg/i
            if (extensoes.test(path.extname(file.originalname))){
                    cb(null, true)
            }else{
                    return cb('Arquivo não suportado. Apenas jpg e jpeg são suportados.')
            }
    }

    var upload = multer({ storage: storage, fileFilter: fileFilter })

    router.post('/', upload.single('foto'))
    router.post('/', postMid)
    router.put('/', postMid)

    router.get('/', async (req, res) => {
            const posts = await Post.findAll()
            res.json({posts: posts})
    })

    router.get('/:id', async (req, res) => {
            const post = await Post.findByPk(req.params.id, 
                    {include: [{model: Usuario}], raw: true, nest: true})

            const postProcessado = prepararResultado(post)
            res.json({posts: postProcessado})
    })

    router.post('/:id/upload', upload.single('foto'), async (req, res) => {
            console.log(req.file)
            const id = req.params.id
            const post = await Post.findByPk(id)
            if (post){
                    post.foto = `/static/uploads/${req.file.filename}`
                    await post.save()
                    res.json({msg: "Upload realizado com sucesso!"})
            }else{
                    res.status(400).json({msg: "Post não encontrado!"})
            }
    })

    router.post('/', async (req, res) => {
            const data = req.body
            if (req.file){
                    data.foto = `/static/uploads/${req.file.filename}`
            }
            const post = await Post.create(data)
            res.json({msg: "Post adicionado com sucesso!"})
    })

    router.delete('/', async (req, res) => {
            const id = req.query.id
            const post = await Post.findByPk(id)
            if (post){
                    await post.destroy()
                    res.json({msg: "Post deletado com sucesso!"})
            }else{
                    res.status(400).json({msg: "Post não encontrado!"})
            }
    })

    router.put('/', async (req, res) => {

            const id = req.query.id
            const post = await Post.findByPk(id)

            if (post){
                    post.titulo = req.body.titulo
                    post.texto = req.body.texto
                    await post.save()
                    res.json({msg: "Post atualizado com sucesso!"})
            }else{
                    res.status(400).json({msg: "Post não encontrado!"})
            }
    })

    function prepararResultado(post){
            const result = Object.assign({}, post)
            if (result.createdAt) delete result.createdAt
            if (result.updatedAt) delete result.updatedAt
            if (result.userId) delete result.userId
            if (result.Usuario){
                    if (result.Usuario.senha) delete result.Usuario.senha
                    if (result.Usuario.createdAt) delete result.Usuario.createdAt
                    if (result.Usuario.updatedAt) delete result.Usuario.updatedAt
            }
            return result
    }

    module.exports = router

Validação do post

O post pode vir com algum campo em um formato inválido, então, para evitar isso, navegue até o arquivo de validarPost.middleware.js e faça as alterações necessárias. Ao final, o código deve ser ficar de acordo com o modelo abaixo:

    const Ajv = require('ajv')
    const ajv = new Ajv()
    const postSchema = require('../schema/post.schema')

    function validarPost(req, res, next){
            const post = req.body
            if (post.userId){
                    post.userId = Number(post.userId)
            }
            const validate = ajv.compile(postSchema)
            const valid = validate(post)
            if (valid){
                    next()
            }else{
                    res.status(400).json({msg: "Dados inválidos", erros: validate.errors})
            }
    }

    module.exports = validarPost

Versão 5.3 - Todos os Direitos reservados