GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Colocar um contador em um arquivo json - criando API com memória interna

Tags: #<Tag:0x00007f22de2b6f08>

Eu preciso criar uma api post e pedir nome e email do usuário retornando pra ele o id, nome e email sem usar um banco de dados. Pra isso eu preciso fazer um contador do Id, quando eu passo esse id ele não acrescenta e fica sempre no mesmo número, help!
Criei uma variável global id:

Conts id = 0

Depois fiz assim:

router.post('/criarusu', (req,res) => {   
    const {nome,email} = req.body
    const currentContent = readfile()
    currentContent.push({id,nome,email}) 
    fs.writeFileSync('./user/dados.json', JSON.stringify(currentContent), 'utf-8')
    res.send(currentContent)
    id++    
})

resultado em json:

{
    "id": 0,
    "nome": "Ramon0"
}, {
    "id": 0,
    "nome": "Ramon1"
}

Já mudei a ordem do id pro começo e ele mudou pra 1, mas só fica em 1 com os novos dados, mas quero que comece em 0 mesmo e vá acrescentando. Estou aprendendo ainda, se puder me ajudar muito obrigada!

SOLUÇÃO:

Nesse caso eu desisti de começar com zero o contador e criei uma variável que gera um número aleatório com letras e números. Assim:

router.post(’/criarusu’, (req,res) => {
const {nome,email,genero} = req.body
const currentContent = readfile()
const id = Math.random().toString(32).substr(2,9)
currentContent.push({id,nome,email,genero})
writeFile(currentContent)
res.send({id,nome,email,genero})
})

Ou, caso queira começar a contar do zero, pode seguir a orientação do @Elifaz, ou até criar uma API fake como sugeriu o @Lucas_Camara. Obrigada pela participação meninos! :slight_smile:

Acredito que vc deveria incrementar o id antes de escrever no arquivo (para evitar ID igual a zero). E essa variável global é Conts mesmo? Acredito que vc quis colocar const. E mesmo assim, não use const pois ela impede que o valor da variável seja alterado. Tente declarar como var.

Não sei para qual finalidade vc precisa fazer isso (se é para estudo somente ou como solução para algo). Mas tu consegue criar um API REST fake com esse cara: https://www.npmjs.com/package/json-server, sem precisar ficar manipulando arquivos.

O ideal seria que voce nao iniciasse nenhuma ID nessa area do seu codigo e que o seu banco de dados ja cuidasse dessa parte, se for mysql certifique-se de deixar a sua ID PK AUTO_INCREMENT e ai voce apenas passa o {nome, email} adiante.


Ah, voce esta usando FS, hm, interessante (vou deixar o comentario acima aberto, pois pode ajudar alguem no futuro)


De qualquer forma, a sua constante é iniciada toda vez que a funcao que depende dela é iniciada dentro do seu arquivo onde ela esta escrita, por traz das cortinas o que acontece é que a variavel é empurrada para o topo do arquivo em uma acao chamada hoisting e a funcao entra na call stack onde assim que executada ela utiliza o valor da variavel que nesse caso seria 0, e depois no final ela tenta alterar o valor de 0 para 1 (por ser uma constante voce teria um erro antes mesmo de rodar o seu codigo completamente, mas vamos assumir que é uma let), mas uma vez que a funcao é executada, como voce nao guarda um state persistente na memoria dessa variavel, ela acaba sendo limpa pelo garbage collector da engine rodando o node. Entao o valor da sua variavel caso fosse let alteraria de 0 -> 1 toda vez que a sua funcao fosse chamada, mas depois sumiria e reiniciaria ao 0 novamente.


Ideal seria voce criar uma busca da ultima id do seu arquivo mais recente e passar a id ja incrementada antes do seu writeFileSync acontecer como o Lucas_Camara mencionou.

Boa sorte!

Olá Lucas!
Sim! Errei na digitação, é const mesmo haha, mas vou concertar.
Obrigada pelo site, nunca ouvi falar haha!
Era uma solução pra estudo mesmo.

Hmm, bacana sua sugestão! Não usei o banco de dados dessa vez, foi só pra estudo então resolvi usar memória interna mesmo.
Nesse caso eu desisti de começar com zero o contador e criei uma variável que gera um número aleatório com letras e números. Assim:

router.post(’/criarusu’, (req,res) => {
const {nome,email,genero} = req.body
const currentContent = readfile()
const id = Math.random().toString(32).substr(2,9)
currentContent.push({id,nome,email,genero})
writeFile(currentContent)
res.send({id,nome,email,genero})
})

Ficou muito mais fácil e limpo. Obrigada pelas dicas!! :))

1 Curtida
//