Criando uma aplicação Stateful com Node


Uma aplicação stateful é aquela que mantém o estado do cliente entre diferentes requisições. Isso significa que o servidor mantém informações em memória sobre o estado de cada usuário e pode usar essas informações para personalizar as respostas. Por outro lado, uma aplicação stateless não mantém informações sobre o estado do usuário entre requisições individuais. Cada requisição é tratada de forma independente, sem referência ao estado anterior.

No código abaixo, temos uma aplicação stateful criada com Node. Ela consiste em um servidor HTTP simples que permite a criação e listagem de usuários. A cada requisição POST para /users, um novo usuário é adicionado ao array users que comportá-se como um banco de dados em memória. Quando uma requisição GET é feita para /users, a lista de usuários é retornada como resposta.

import http from 'node:http'
 
const users = []
 
const server = http.createServer((request, response) => {
    const { method, url } = request
    
    if (method === 'GET' && url === '/users') {
        return response
            .setHeader('Content-type', 'application/json')
            .end(JSON.stringify(users))
    }
 
    if (method === 'POST' && url === '/users') {
        users.push({
            id: 1,
            name: 'John Doe',
            email: 'johndoe@example.com'
        })
        return response.end('Criação de usuário')
    }
 
    return response.end('Hello World!')
})
 
server.listen(3000)

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 58
Date: Sat, 27 Apr 2024 02:08:21 GMT
Keep-Alive: timeout=5

[{"id":1,"name":"John Doe","email":"johndoe@example.com"}]

Embora, a resposta acima esteja retorno o conteúdo esperado, existem algumas padronizações que devem ser seguidas ao criar uma API, sendo uma delas a utilização de Cabeçalhos HTTP. Seguindo o exemplo acima, um cabeçalho importante de especificar é Content-Type para definir o conteúdo da resposta como JSON.

if (method === 'GET' && url === '/users') {
	return response
		.setHeader('Content-type', 'application/json')
		.end(JSON.stringify(users))
}
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 58
Content-type: application/json
Date: Sat, 27 Apr 2024 02:23:08 GMT
Keep-Alive: timeout=5

[
    {
        "email": "johndoe@example.com",
        "id": 1,
        "name": "John Doe"
    }
]

Como pode-se notar, definir cabeçalhos apropriados é importante para garantir que as requisições e respostas sejam interpretadas corretamente pelos clientes e servidores HTTP. Os cabeçalhos podem conter uma variedade de informações, como o tipo de conteúdo, codificação, autenticação, cache, entre outros, e são essenciais para a comunicação eficaz entre clientes e servidores na web.

Referências