Como criar um banco de dados simples?

Como faço para criar um banco de dados em formato de arquivo da forma mais simples possível para usar em projetos HTML/Node (não sei PHP), se possível um arquivo JSON.

Existe a solução do Local Storage, mas não é algo acessível, o meu de outro projeto sumiu, é muito vulnerável.

Enfim, como crio esse banco de dados? Tem que usar o Node? Fazer em formato de API?

Vou te ajudar a fazer um Banco de Dados extremamente facil, NoSQL...

Por exemplo, você pode criar uma rota para ler os dados de um banco de dados JSON da seguinte maneira:

const express = require('express');
const fs = require('fs');
const app = express();

app.get('/produtos', (req, res) => {
  fs.readFile('./bd.json', (err, data) => {
    if (err) throw err;
    res.json(JSON.parse(data));
  });
});

app.listen(3000, () => {
  console.log('API iniciada na porta 3000');
});

abaixo um exemplo do bd.json

{
  "produtos": [
    {
      "id": 1,
      "nome": "Caneta",
      "preco": 3.50
    },
    {
      "id": 2,
      "nome": "Lápis",
      "preco": 2.00
    },
    {
      "id": 3,
      "nome": "Borracha",
      "preco": 1.50
    }
  ]
}

Adicionar dados ao Banco de Dados NoSQL

app.post('/produtos', (req, res) => {
  fs.readFile('./bd.json', (err, data) => {
    if (err) throw err;
    const bancoDeDados = JSON.parse(data);
    bancoDeDados.produtos.push({
      "id": bancoDeDados.produtos.length + 1,
      "nome": req.body.nome,
      "preco": req.body.preco
    });
    fs.writeFile('./bd.json', JSON.stringify(bancoDeDados), (err) => {
      if (err) throw err;
      res.send('Produto adicionado com sucesso');
    });
  });
});

Atualizar dados ao Banco de Dados NoSQL

app.put('/produtos/:id', (req, res) => {
  fs.readFile('./bd.json', (err, data) => {
    if (err) throw err;
    const bancoDeDados = JSON.parse(data);
    const produto = bancoDeDados.produtos.find(p => p.id == req.params.id);
    if (produto) {
      produto.nome = req.body.nome;
      produto.preco = req.body.preco;
      fs.writeFile('./bd.json', JSON.stringify(bancoDeDados), (err) => {
        if (err) throw err;
        res.send('Produto atualizado com sucesso');
      });
    } else {
      res.send('Produto não encontrado');
    }
  });
});

Deletar dados ao Banco de Dados NoSQL

app.delete('/produtos/:id', (req, res) => {
  fs.readFile('./bd.json', (err, data) => {
    if (err) throw err;
    const bancoDeDados = JSON.parse(data);
    const produtoIndex = bancoDeDados.produtos.findIndex(p => p.id == req.params.id);
    if (produtoIndex >= 0) {
      bancoDeDados.produtos.splice(produtoIndex, 1);
      fs.writeFile('./bd.json', JSON.stringify(bancoDeDados), (err) => {
        if (err) throw err;
        res.send('Produto deletado com sucesso');
      });
    } else {
      res.send('Produto não encontrado');
    }
  });
});

NÃO ESQUEÇA DE INSTALAR O EXPRESS

ESSE CODIGO PRECISA SER ADICIONANDO UM SISTEMA DE SEGURANÇA PARA EVITAR QUE ALGUEM MAL INTENCIONADO CIRE UM ARQUIVO GIGANTE E ATRAPALHE SEU SISTEMA

NÃO TESTEI POREM CASO NÃO FUNCIONE SO COMENTAR QUE ARRUMO PRA VOCÊ, E LEMBRANDO QUE O ARQUIVO TEM QUE TER PERMISSÃO DE ESCRITA

Muito foda, nao conhecia os métodos writeFile e readFile, abriu a mente agr, muito obrigado
Da pra usar o PrismaORM + sqlite, fica muito facil criar o db e usar ele
o objetivo era fazer um NoSQL o mais simples possível pra consumir pouco processamento e memoria... usando soluções de terceiros sem duvida e uma ótima ideia porém consome muito recurso...
Para adicionar um sistema de segurança aos códigos acima, você pode usar uma chave secreta para criptografar e assinar as requisições HTTP. Isso garante que as requisições só possam ser realizadas pelo cliente autorizado. Um exemplo de como fazer isso é usando o módulo "jsonwebtoken" do Node.js para criar e verificar tokens JWT (JSON Web Token). Primeiro, você precisa instalar o módulo "jsonwebtoken" usando o comando "npm install jsonwebtoken": `npm install jsonwebtoken` Depois, você pode usar o módulo para criar um token JWT para cada cliente autorizado. O token deve conter um "id" do cliente e uma "chave secreta" compartilhada pelo cliente e pelo servidor. O código ficaria assim: ``` const jwt = require('jsonwebtoken'); const chaveSecreta = 'chave_secreta'; // Função para criar um token JWT para o cliente const criarToken = (id) => { return jwt.sign({ id }, chaveSecreta, { expiresIn: '1h' }); } // Rota para criar um token para o cliente app.post('/login', (req, res) => { // Verifica as credenciais do cliente (por exemplo, usuário e senha) const credenciaisValidas = verificarCredenciais(req.body.usuario, req.body.senha); if (credenciaisValidas) { // Se as credenciais forem válidas, cria um token JWT para o cliente const token = criarToken(req.body.usuario); res.send({ token }); } else { // Se as credenciais não forem válidas, envia um erro res.status(401).send('Usuário ou senha inválidos'); } }); ``` Depois de criar um token para o cliente, você pode adicionar uma função de verificação de autenticação em cada rota que precisa de autenticação. A função deve verificar se o token enviado pelo cliente é válido usando a chave secreta compartilhada. O código ficaria assim: ``` // Função para verificar se o token é válido const verificarToken = (req, res, next) => { // Verifica se o token foi enviado na requisição const token = req.headers['x-access-token']; if (!token) { return res.status(401).send('Token não enviado'); } // Verifica se o token é válido usando a chave secreta jwt.verify(token, chaveSecreta, (err, decoded) => { if (err) { return res.status(401).send('Token inválido'); } // Se o token for válido, adiciona o "id" do cliente na requisição // para uso posterior req.clienteId = decoded.id; next(); }); } // Adiciona a função de verificação de autenticação em todas as rotas // que precisam de autenticação app.post('/produtos', verificarToken, (req, res) => { // O código da rota fica aqui }); app.put('/produtos/:id', verificarToken, (req, res) => { // O código da rota fica aqui }); app.delete('/produtos/:id', verificarToken, (req, res) => { // O código da rota fica aqui }); ``` Com isso, todas as rotas que precisam de autenticação passarão pelo processo de verificação de token antes de executar o código da rota. Se o token for válido, a rota será executada normalmente. Se o token for inválido ou não existir, a função enviará uma resposta de erro para o cliente.
Muito foda, não sei se preciso de tanta segurança assim, é só pra eu conseguir editar os dados na mão caso precise. Mas salvei essa sua resposta e vou tirar um dia pra aplicar, estudar e entender esses conceitos novos, muito obrigado
se você estiver utilizando a vercel pode colocar o login e senha nas variaveis globais da vercel e comparar com o passado pela aplicação depois de sanatizar e pronto... Agora você tem um super sistema NoSQL seguro e que faz o que você deseja...

Realmente, no seu caso SQLite é uma boa solução.

Você consegue utilizar SQLite atráves de nodeJS. A maioria dos frameworks para node vão te oferecer formas de configurar um banco de dados usando SQLite, um exemplo que eu conheço é um NestJS. Caso não queira utilizar um framework, existe bibliotecas em nodeJS que irão te ajudar nessa tarefa, como a ORM sequelize.

Vale a pena da uma olhada em um SQLite também.

Se for algo bem simples mesmo você pode usar o módulo FS para ler um arquivo json, edita-lo e depois sobrescrever o arquivo json, isso tudo em nodejs

Se for realmente um banco de dados, mas simples tem um tutorial ensinando a criar um banco de dados como o sqlite. https://cstack.github.io/db_tutorial/

nao reinvente a roda, use sqlite se realmente quiser manter um banco de dados junto com o projeto. tem outras opcoes como por exemplo AWS DynamoDB, restdb, Fauna ou mesmo o Firebase Firestore.

armazenar informacoes assim como vc esta propondo, em json escritos no disco, pode até funcionar mas a performance pode ficar comprometida.

Sou iniciante, tem como usar esse SQLite sem ser em Python e PHP?
sim, tem uma biblioteca para nodejs https://www.npmjs.com/package/sqlite3

Toda linguagem oferece alguma forma de trabalhar com arquivos. É possível utilizar vários formatos ex: file.json, file.csv, file.bat, file.txt, etc....

Só aprender como manipular arquivos na linguagem que deseja utilizar.

Exemplo de arquivo .cvs Fonte: Blog do Tomás Vásquez