Framework de desenvolvimento baseado em node.js-Koa

1. Introdução

Koa é  uma estrutura de desenvolvimento web de próxima geração baseada na plataforma nodeJs, construída pela equipe original por trás do Express, e tem o compromisso de se tornar uma estrutura web menor, mais expressiva e mais robusta. Usando o koa para escrever aplicativos da web, combinando diferentes geradores, você pode evitar o aninhamento repetido e tedioso de funções de retorno de chamada e melhorar muito a eficiência do tratamento de erros. Koa não vincula nenhum middleware no método do kernel, ele apenas fornece uma biblioteca de funções leve e elegante, o que torna a escrita de aplicativos da web útil. Existem atualmente duas versões principais 1.xe 2.x. A versão 2.x usa o açúcar de sintaxe async await suportado após Node.js v7.6.0, fornecendo um modelo de programação assíncrona mais elegante.

2. O conceito central de Koa

O que exatamente Koa faz? O mais importante e fundamental no Koa é realizar o processamento do protocolo http. Ele tem três conceitos principais principais:

  1. Aplicação Koa: programa principal
  2. Contexto: contexto
  3. Solicitação, Resposta: solicitação e resposta

Três, uso básico

【1】 Preparação


// 1.Koa必须使用7.6以上的node版本,检查node版本,低于要求的话就升级node
$ node -v 

// 2.创建一个 my_koa 文件夹,生成package.json文件
$ npm init -y

// 3.安装koa依赖
$ npm install --save koa

[2] Escrever código

Crie um arquivo de entrada index.js na pasta my_koa, e então usamos koa para configurar um serviço http

// index.js文件
const Koa = require('Koa');  // 引入Koa
const app = new Koa();  // 创建Koa实例,定义Application

// 使用use方法来处理上下文
app.use(async ctx => {  
  // ctx是包含整个应用的上下文,可以对用户的请求做一些处理
  ctx.body = 'hello, World!'
});

app.listen(3000);  // 设置端口号,让Koa应用运行在3000端口上

Depois de escrever o código acima no arquivo index.js, abra o terminal no diretório do arquivo e insira o nó index.js para executar o arquivo.

Em seguida, abra o navegador e digite: localhost: 3000, você pode ver os resultados que produzimos

      

Quatro, Aplicação (aplicação)

Um aplicativo Koa é um objeto que contém um conjunto de funções de middleware, que é organizado e executado em forma de pilha. Koa é semelhante a muitos outros sistemas de middleware que você pode ter encontrado.

[1] app.listen () : vincula um servidor de porta como a entrada do programa e vários podem ser vinculados. O seguinte é um aplicativo Koa inútil que está vinculado à  3000 porta

const Koa = require('koa');
const app = new Koa();
app.listen(3000); 

// app.listen(3000)是以下方法的语法糖

const http = require('http');
const Koa = require('koa');
const app = new Koa();
http.createServer(app.callback()).listen(3000);

[2] app.use (função) : adicione o método de middleware fornecido a este aplicativo, app.use () retorna isso, para que possa ser expresso em cadeia

app.use(someMiddleware)
app.use(someOtherMiddleware)
app.listen(3000)

// 等同于

app.use(someMiddleware).use(someOtherMiddleware).listen(3000)

[3] app.keys =: definir a chave de cookie assinada

app.keys = ['im a newer secret', 'i like turtle'];
app.keys = new KeyGrip(['im a newer secret', 'i like turtle'], 'sha256');

[4] app.context: o protótipo a partir do qual ctx é criado. Você pode adicionar outros atributos para ctx editando app.context    

app.context.db = db();

app.use(async ctx => {
  console.log(ctx.db);
});

[5] Tratamento de erros: adicione um ouvinte de evento de "erro"

app.on('error', (err, ctx) => {
  log.error(err, ctx)
});

[6] next (): A função pausa e passa o controle para o próximo middleware definido

const Koa = require('Koa');  // 引入Koa
const app = new Koa();  // 创建Koa实例,定义Application

const one = (ctx, next) => {
    console.log('进 one');
    next();
    console.log('出 one');
}
const two = (ctx, next) => {
    console.log('进 two');
    next();
    console.log('出 two');
}
const three = (ctx, next) => {
    console.log('进 three');
    next();
    console.log('出 three');
}

app.use(one);
app.use(two);
app.use(three)
app.listen(3000)

Cinco, contexto (contexto)

Koa fornece um objeto Context, que representa o contexto de uma conversa. O objeto Context encapsula o objeto de solicitação (solicitação) HTTP do nó e o objeto de resposta (resposta) HTTP em um único objeto. Ao processar esse objeto, você pode controlar o conteúdo retornado ao usuário.

[1] Métodos específicos de contexto

  1. ctx.req: objeto de solicitação do nó
  2. ctx.res: objeto de resposta do nó
  3. ctx.request: objeto de solicitação de koa
  4. ctx.response: objeto de resposta de koa
  5. ctx.state: namespace recomendado, usado para passar informações e sua visão de front-end por meio de middleware
  6. ctx.app: referência de instância de aplicativo
  7. ctx.cookies.get (nome, [opções]) : 获取 cookie
  8. ctx.cookies.set (nome, valor, [opções]) : 设置 cookie
  9. ctx.throw ([status], [msg], [propriedades]): lança uma exceção
  10. ctx.assert (valor, [status], [msg], [propriedades]): lança um erro

Seis, solicitação (solicitação)

O objeto Koa Request é uma abstração no topo do objeto de solicitação nativo do nó e fornece muitas funções úteis para o desenvolvimento do servidor HTTP.

  1. request.header: objeto de cabeçalho de solicitação, que pode ser definido e atribuído (request.header = xxx)
  2. request.headers: objeto de cabeçalho de solicitação, o alias é request.header, pode ser definido e atribuído (request.headers = xxx)
  3. request.method: método de solicitação, você pode definir a atribuição (request.method = xxx)
  4. request.length: Retorna o Content-Length solicitado como um número ou indefinido
  5. request.url: Obtenha o URL de solicitação, você pode definir o URL de solicitação, que é útil para regravar url (request.url = xxx)
  6. request.originalUrl: Obtenha o URL original da solicitação
  7. request.origin: Obtenha a fonte do URL, incluindo protocolo e host
  8. request.href: Obtenha o URL de solicitação completo, incluindo protocolo, host e url
  9. request.path: obtenha o nome do caminho da solicitação, você pode definir o valor e manter a string de consulta quando ela existir (request.path = xxx)
  10. request.querystring: De acordo com? para obter a string de consulta original, você pode definir a string de consulta original (request.querystring = xxx)
  11. request.search: Use? para obter a string de consulta original, você pode definir a string de consulta original (request.search = xxx)
  12. request.host: obtenha o host, se existir

  13. request.hostname: obtenha o nome do host, se existir

  14. request.URL: Obtenha o objeto URL analisado por WHATWG

  15. request.type: Obtenha o Content-Type da solicitação, excluindo "charset" e outros parâmetros

  16. request.charset: Obtenha o conjunto de caracteres solicitado quando ele existir ou indefinido

  17. request.query: Obtenha a string de consulta analisada, quando não houver string de consulta, retorne um objeto vazio, você pode definir a atribuição (request.query = xxx)

  18. request.fresh: Verifique se o cache de solicitação está "fresco", ou seja, se o conteúdo não mudou. Este método é usado para negociação de cache entre If-None-Match / ETag e If-Modified-Since e Last-Modified. Deve ser citado depois de definir um ou mais desses cabeçalhos de resposta

  19. request.stale: o oposto de request.fresh

  20. request.protocol: retorna o protocolo de solicitação, "https" ou "http"

  21. request.secure: Use ctx.protocol == "https" para verificar se a solicitação é enviada via TLS

  22. request.ip: solicitar endereço remoto

Sete, Resposta (resposta)

O  objeto Koa Response é uma abstração no topo do objeto de resposta nativo do nó e fornece muitas funções úteis para o desenvolvimento do servidor HTTP.

  1. response.header: objeto de cabeçalho de resposta
  2. response.headers: objeto de cabeçalho de resposta, o alias é response.header
  3. response.socket: socket de resposta
  4. response.status: obtenha o status da resposta. Por padrão, response.status é definido como 404 em vez de 200 como o res.statusCode do nó, e o status da resposta é definido pelo código numérico (response.status = xxx)
  5. response.message: obtém a mensagem de status de resposta. Por padrão, response.message está associado a response.status, e a mensagem de status de resposta pode ser definida para um determinado valor (response.message = xxx)
  6. response.length: retorna o Content-Length da resposta como um número, ou deduzido de ctx.body, ou indefinido, você pode definir o Content-Length da resposta para um determinado valor (response.length = xxx)
  7. response.body: Obtenha o corpo da resposta, você pode definir o corpo da resposta para escrita de string, escrita de buffer, pipeline de fluxo, Object || Array JSON-stringification, resposta nula sem conteúdo
  8. response.type: obtenha a resposta Content-Type, excluindo "charset" e outros parâmetros, você pode definir a resposta Content-Type por meio de string mime ou extensão de arquivo (response.type = xxx)

[1] Tipos de resposta HTTP

O tipo de retorno padrão do Koa é texto / simples (texto simples). Se você quiser retornar outros tipos de conteúdo, você pode usar ctx.request.accepts para determinar quais dados o cliente deseja aceitar (de acordo com o campo Aceitar da solicitação HTTP ). Em seguida, use ctx.response.type para especificar o tipo de retorno.

const Koa = require('koa')
const app = new Koa()

const main = (ctx, next) => {
  if (ctx.request.accepts('json')) {
    ctx.response.type = 'json';
    ctx.response.body = { data: 'Hello World' };
  } else if (ctx.request.accepts('html')) {
    ctx.response.type = 'html';
    ctx.response.body = '<p>Hello World</p>';
  } else if (ctx.request.accepts('xml')) {
    ctx.response.type = 'xml';
    ctx.response.body = '<data>Hello World</data>';
  } else {
    ctx.response.type = 'text';
    ctx.response.body = 'Hello World';
  };
}; //直接运行页面中会显示json格式,因为我们没有设置请求头,所以每一种格式都是ok的。   

app.use(main) //app.use(function)用来加载中间件。
app.listen(3000)

8. Middleware

【1. Introdução

A maior característica do koa é o controle exclusivo do processo de middleware, que é o famoso "modelo cebola". Podemos ver claramente que uma solicitação passa pelo middleware camada por camada de fora para dentro e de dentro para a resposta quando respondendo. Percorra o middleware camada por camada. Assim como quando colocamos um palito em uma cebola, o palito passa por camadas de casca de cebola de fora para dentro para chegar ao "coração de cebola". Quando o retiramos, o palito passa por uma camada de casca de cebola do de dentro para fora.

 

【2】 Caso

Basicamente, todas as funções do Koa são implementadas por meio de middleware. Cada middleware aceita dois parâmetros por padrão. O primeiro parâmetro é o objeto Context e o segundo parâmetro é a próxima função. Enquanto a próxima função for chamada, o direito de execução pode ser transferido para o próximo middleware. Se a próxima função não for chamada dentro do middleware, o direito de execução não será repassado. As funções middleware1, middleware2 e middleware3 no código a seguir são chamadas de "middleware" (middleware) porque estão no meio da Solicitação HTTP e da Resposta HTTP e são usadas para implementar algumas funções intermediárias. app.use () é usado para carregar middleware

const Koa = require('Koa');
const app = new Koa();

// 定义三个中间件的方法:middleware1、middleware2、middleware3,next()方法代表执行完当前中间件方法后,继续执行后面的方法
const middleware1 = function async(ctx, next) {
  console.log('这是第一条middleware');
  next();
  console.log('这是第一条next之后的打印')
}
const middleware2 = function async(ctx, next) {
  console.log('这是第二条middleware');
  next();
  console.log('这是第二条next之后的打印')
}
const middleware3 = function async(ctx, next) {
  console.log('这是第三条middleware');
  next();
  console.log('这是第三条next之后的打印')
}

// 使用中间件方法
app.use(middleware1)
app.use(middleware2)
app.use(middleware3)

app.listen(5000)

[3] Pilha de middleware

Múltiplos middlewares formarão uma pilha intermediária, que será executada na ordem de "primeiro a entrar, último a sair"

  1. app.use () é executado sequencialmente, qual middleware é referenciado primeiro e o método de qual middleware será executado primeiro

  2. Ao encontrar next (), Koa irá entregar o middleware atual para o próximo middleware para processamento

  3. Se next () não for definido em um método, Koa encerrará a solicitação por padrão e retornará os dados

  4. Se houver código após next (), Koa esperará que todo o aplicativo seja chamado na ordem de app.use () e, em seguida, voltará para executar o código após next () na ordem inversa, que é o primeiro em -Último acabei de mencionar.

Nove, roteador Koa (roteamento)

Os sites geralmente têm várias páginas. Quando solicitamos diferentes apis ou caminhos diferentes, temos que executar métodos diferentes e retornar resultados diferentes. Neste momento, temos que usar o middleware Koa-router da Koa para lidar com isso.

[1] Roteador Koa antropomórfico

 npm install -S koa-router

【2】 Caso

const Koa = require('Koa');
const Router = require('koa-router');  // 引用koa-router
const app = new Koa();
const router = new Router();

// 定义get请求
// home是我们定义的访问路径:localhost:8000/home
router.get('/home', ctx => {
  // 这个区域是中间件要去处理的上下文方法
  ctx.body = '这是主页'
})

router.get('/detail', ctx => {
    ctx.body = '这是详情页'
})

// app.use(router.routes()) 是把上面定义的路由里面的方法添加到Koa应用中
// allowedMethods方法可以把它看做一个拦截器,可以拦截一些我们应用没有定义的请求,然后返回相应的错误信息

app.use(router.routes()).use(router.allowedMethods())

app.listen(4000);  // 设置端口号,让Koa应用运行4000端口上;

// 在浏览器访问 localhost:8000/home 输出了"这是主页"
// 在浏览器访问 localhost:8000/detail 输出了"这是详情页"

10. Link de referência

https://koa.bootcss.com/

http://www.ruanyifeng.com/blog/2017/08/koa.html

 

Os artigos são atualizados continuamente todas as semanas. Você pode pesquisar por " Coleção de front-end  " no WeChat para  lê-la pela primeira vez, responda a [ Vídeo ] [ Livro ] para receber materiais de vídeo 200G e 30 materiais de livros em PDF

 

 

Acho que você gosta

Origin blog.csdn.net/qq_38128179/article/details/112648175
Recomendado
Clasificación