Executando verificação de segurança...
2

Olá, achei interessante o desafio e com algumas pesquisas fiz um breve projetinho com sua ideia.

// projeto proposto
mkdir save-image cd save-image npm init

// Prisma CLI
npm install -g prisma

// crie um arquivo 'schema.prisma' para as definições

datasource db {
  provider = "sqlite"
  url      = "file:dev.db"
}

generator client {
  provider = "prisma-client-js"
}

model User {
  id       Int    @id @default(autoincrement())
  name     String
  email    String @unique
  password String
  image    Bytes?
}

// para gerar o modelo do Prima baseado no arquivo 'schema.prisma'
npx prisma generate

// dependencias necessárias
npm install express cors @prisma/client sqlite3 npm install multer

// 'index.js' com instruções

const express = require('express');
const cors = require('cors');
const multer = require('multer');
const { PrismaClient, Prisma } = require('@prisma/client');

const prisma = new PrismaClient();
const app = express();
app.use(cors());

// adiciona users para teste
app.post('/users', async (req, res) => {
  const newUser = await prisma.user.create({
    data: {
      id: 1,
      name: 'John Doe',
      email: '[email protected]',
      password: 'password123',
    },
  });
  res.json(newUser);
});

// retorna users
app.get('/users', async (req, res) => {
  const users = await prisma.user.findMany();
  res.json(users);
});

// remover users
app.delete('/users', async (req, res) => {
  const users = await prisma.user.deleteMany();
  res.json(users);
});

// Configuração do multer para salvar as imagens no diretório "uploads"
const storage = multer.diskStorage({
  destination: './uploads',
  filename: (req, file, cb) => {
    cb(null, Date.now() + '-' + file.originalname);
  }
});
const upload = multer({ storage });

// Rota para receber a imagem e salvar no banco de dados
app.post('/users/:id/image', upload.single('image'), async (req, res) => {
  const { id } = req.params;
  const { buffer } = req.file;

  try {
    const updatedUser = await prisma.user.update({
      where: { id: Number(id) },
      data: { image: buffer },
    });
    res.json(updatedUser);
  } catch (error) {
    console.error(error);
    res.status(500).send('Erro ao atualizar o usuário.');
  }
});

app.listen(3000, () => console.log('Servidor iniciado na porta 3000'));

// Execute o comando para gerar a tabela
npx prisma migrate dev

// Execute o comando para iniciar o projeto
npm start

Espero que ajude.

Carregando publicação patrocinada...
1
2

Salvar imagens no banco de dados não é uma boa prática. Apesar de ser possível, bancos de dados relacionais tradicionais não são os melhores locais para armazenar e recuperar esse tipo de dado.

O caminho mais básico utilizado é salvar a imagem ou qualquer arquivo (música, texto, video...) em algum local em disco e gravar na base de dados apenas o caminho desse arquivo em disco. Além disso, seu servidor deve servir esses arquivos como arquivos estáticos.

Mesmo assim, não é o melhor dos cenários, em aplicações reais você deve salvar esses arquivos binários em serviçoa como amazon S3 ou similar.

1

Ótima observação, creio que o @HenriikOliveira não tenha notado que o código salve a imagem em um pasta local. Criei o código apenas para exemplificar a possíbilidade, mas está longe de ser uma aplicação real.

1

Uma maneira de fazer isso é usar o módulo fs do Node.js para ler o arquivo da imagem e retorná-lo como resposta.