Funções de Servidor
As funções do servidor são microsserviços especializados que no momento da transpilação são convertidos em pontos de entrada da API.
Para sinalizar uma função como uma função de servidor, você deve declará-la como static async
.
Ser uma função estática significa que ela não tem acesso ao escopo da instância.
No entanto, em vez de chamar a versão estática da classe, você deve invocá-la como uma função de instância.
As funções do servidor podem ser chamadas a qualquer momento em seu código e não estão limitadas a etapas de pré-processamento.
import Nullstack from 'nullstack';
class Component extends Nullstack {
static async increment(context) {
context.count++;
}
async handleClick() {
await this.increment();
}
// ...
}
export default Component;
✨ Aprenda mais sobre contexto.
Comportamento do cliente
Ao chamar uma função de servidor do cliente, os argumentos serão serializados como JSON.
Os argumentos serão postados contra a API gerada automaticamente e mesclados com o contexto do servidor quando atingir o servidor.
O valor de retorno da função do servidor será serializado de volta para o cliente e pode ser usado perfeitamente como se fosse uma função local.
import Nullstack from 'nullstack';
class Component extends Nullstack {
static async increment(context) {
context.count++;
return context.count;
}
async handleClick() {
this.count = await this.increment();
}
// ...
}
export default Component;
Comportamento do servidor
As funções de servidor serão usadas como funções locais, simplesmente criando um alias da chamada instância para a classe e mesclando os argumentos com o contexto do servidor.
Date Convenience
As datas são serializadas como UTC em JSON e desserializadas de volta para objetos Date
.
import Nullstack from 'nullstack';
class Component extends Nullstack {
async initiate() {
const date = new Date();
const verified = this.verifyDay({date});
}
static async verifyDay({date}) {
return date.getDay() === new Date().getDay();
}
// ...
}
export default Component;
Fetch Convenience
fetch
está disponível em funções de servidor e cliente para fins de isomorfia.
import Nullstack from 'nullstack';
class Component extends Nullstack {
// ...
async initiate() {
const url = 'https://api.github.com/repos/nullstack/nullstack/issues';
const response = await fetch(url);
this.issues = await response.json();
}
// ...
}
export default Component;
Importações apenas de servidor
As dependências importadas que são usadas apenas dentro das funções do servidor serão excluídas do pacote do cliente.
Isso é útil para acessar módulos exclusivos do node.js e reduzir o tamanho do pacote do cliente por meio do pré-processamento de dados, como o markdown, sem ter que expor a dependência ao usuário final.
import Nullstack from 'nullstack';
import {readFileSync} from 'fs';
import {Remarkable} from 'remarkable';
class Application extends Nullstack {
static async getTasks() {
const readme = readFileSync('README.md', 'utf-8');
return new Remarkable().render(readme);
}
// ...
}
export default Application;
Segurança
Lembre-se de que cada função do servidor é semelhante a uma rota do Express na API, e deve ser codificada sem depender da lógica de exibição para a segurança.
🔒 As funções de servidor com o nome começando com "start" (e opcionalmente seguido por uma letra maiúscula) não geram um endpoint de API, para evitar inundação de contexto malicioso.
import Nullstack from 'nullstack';
class Component extends Nullstack {
static async getCount({request, count}) {
if(!request.session.user) return 0;
return count;
}
// ...
}
export default Component;
💡 As funções do servidor não são expostas ao cliente.
✨ Aprenda mais sobre a extensão de arquivo NJS.
Palavras reservadas
Os nomes das funções do servidor não podem colidir com os nomes dos métodos de instância da classe atual ou de suas classes pai.
As seguintes palavras não podem ser usadas em funções de servidor:
prepare
initiate
hydrate
update
terminate
As funções de servidor chamadas start
não irão gerar um endpoint de API e só podem ser chamadas por outras funções de servidor.
Prefixos HTTP reservados
Funções de servidor declaradas com nomes começando com verbos HTTP serão executadas de acordo com o respectivo método HTTP. Os prefixos disponíveis são:
get
post
put
patch
delete
import Nullstack from "nullstack";
class HTTPVerbs extends Nullstack {
// isso é uma requisição GET
static async getUserById({ id }) {
// ...
}
// isso é uma requisição POST
static async postUser({ data }) {
// ...
}
// isso é uma requisição PUT
static async putUserById({ id, data }) {
// ...
}
// isso é uma requisição PATCH
static async patchUserById({ id, data }) {
// ...
}
// isso é uma requisição DELETE
static async deleteUserById({ id }) {
// ...
}
// ...
}
export default HTTPVerbs;
💡 Funções de servidor sem nenhum prefixo especial serão por padrão requisições POST.
🔥 Leve em consideração a especificação de cada método HTTP. Por exemplo, requisições GET possuem um limite de 2kb de dados que podem ser passados como parâmetro, então tentar enviar um objeto inteiro para uma função de servidor pode resultar em falha.
Ressalvas
Os endpoints de API gerados automaticamente não devem ser usados por aplicativos de terceiros.
A URL e a implementação podem mudar entre as versões do Nullstack.
✨ Se você deseja construir uma API, aprenda mais sobre como criar uma API com o Nullstack.
Next step
⚔ Saiba mais sobre o contexto.