乐趣区

关于javascript:前端培训中级阶段48-node-10x-之-HTTP模块WEB开发框架介绍

前端最根底的就是 HTML+CSS+Javascript。把握了这三门技术就算入门,但也仅仅是入门,当初前端开发的定义曾经远远不止这些。前端小课堂(HTML/CSS/JS),本着晋升技术水平,打牢基础知识的中心思想,咱们开课啦( 每周四 )。

HTTP 模块、WEB 开发框架介绍、URL & querystring

HTTP 模块

nodejs 中分为 HTTP、HTTPS、HTTP2 三个模块,是不是头秃。

  1. const http = require('http');,作为一般 http/1 的 API。
    Node.js 中的 HTTP 接口旨在反对许多传统上难以使用的协定的个性。
    特地是,大块的(且可能是块编码的)音讯。
    接口永远不会缓冲整个申请或响应,所以用户能够流式地传输数据。
    能够用来作为 HTTP 服务器或者客户端。
  2. const http2 = require('http2');,外围 API 提供了专门针对反对 HTTP/2 协定的个性而设计的底层接口。它不是专门设计为与现有的 HTTP/1 模块 API 兼容。当然,也有兼容的 API。
  3. const https = require('https');,HTTPS 是基于 TLS/SSL 的 HTTP 协定。在 Node.js 中,其被实现为一个独自的模块。

当客户端应用

讲道理我个别是用 axios 来应用,

// 申请服务端
http.get('http://www.lilnong.top/cors/node-http')
    .on('response', (res /** http.IncomingMessage */)=>{res.on('data', (buffer)=>{
            // 这里应该把 buffer 拼接一下的,不应该间接用
            console.log('data', buffer.toString())
        })
    })

对应 axios 咱们能够写的更加简略

axios('http://www.lilnong.top/cors/node-axios')
    .then(v=>v.data)
    .then(data=>console.log(data))

因为大多数申请都是不带申请体的 GET 申请,因而 Node.js 提供了这个便捷的办法。这个办法与 http.request() 惟一的区别是,它将申请办法设置为 GET 并且会主动调用 req.end()。因为 http.ClientRequest 章节中所述的起因,回调必须要生产响应的数据。

当服务端应用

// 启动服务器
const proxy = http.createServer((req, res) => {res.writeHead(200, { 'Content-Type': 'text/plain;charset=utf8'});
    res.end('响应内容');
});
// 监听对应的端口
proxy.listen(1337, '127.0.0.1',(...args)=>{console.log('listen', args)
})

我个别是用 express 来起服务。

  1. proxy.headersTimeout 限度解析器期待接管残缺 HTTP 申请头的工夫。如果不流动,则实用 server.timeout 中定义的规定。然而,如果申请头发送速度十分慢(默认状况下,每 2 分钟最多一个字节),那么基于不流动的超时依然容许连贯放弃关上状态。为了避免这种状况,每当申请头数据达到时,进行额定的查看,自建设连贯以来,没有超过 server.headersTimeout 毫秒。如果查看失败,则在服务器对象上触发 'timeout' 事件,并且(默认状况下)套接字被销毁。无关如何自定义超时行为的详细信息,请参见 server.timeout
  2. proxy.timeout 认定套接字超时的不流动毫秒数。值为 0 将禁用传入连贯的超时行为。套接字超时逻辑在连贯时设置,因而更改此值仅影响到服务器的新连贯,而不影响任何现有连贯。

http2 模块

外围 API 提供了专门针对反对 HTTP/2 协定的个性而设计的底层接口。它不是专门设计为与现有的 HTTP/1 模块 API 兼容。当然,也有兼容的 API。

http2 外围 API 在客户端和服务器之间比 http API 更加对称。例如,大多数事件,比方 'error''connect''stream',都能够由客户端代码或服务器端代码触发。

当服务端应用

http://nodejs.cn/api/http2.html#http2_client_side_example

const http2 = require('http2');
const fs = require('fs');

// 因为没有已知的浏览器反对 [未加密的 HTTP/2](http://nodejs.cn/s/yfVdqh),// 因而在与浏览器客户端进行通信时必须应用 [`http2.createSecureServer()`](http://nodejs.cn/s/zQgH8T)。const server = http2.createSecureServer({key: fs.readFileSync('密钥.pem'),
  cert: fs.readFileSync('证书.pem')
});
server.on('error', (err) => console.error(err));

server.on('stream', (stream, headers) => {
  // 流是一个双工流。stream.respond({
    'content-type': 'text/html; charset=utf-8',
    ':status': 200
  });
  stream.end('<h1> 你好世界 </h1>');
});

server.listen(8443);

要生成此示例的证书和密钥,能够运行:

openssl req -x509 -newkey rsa:2048 -nodes -sha256 -subj '/CN=localhost' 
  -keyout 密钥.pem -out 证书.pem

客户端实例

http://nodejs.cn/api/http2.html#http2_client_side_example

const http2 = require('http2');
const fs = require('fs');
const client = http2.connect('https://localhost:8443', {ca: fs.readFileSync('证书.pem')
});
client.on('error', (err) => console.error(err));

const req = client.request({':path': '/'});

req.on('response', (headers, flags) => {for (const name in headers) {console.log(`${name}: ${headers[name]}`);
  }
});

req.setEncoding('utf8');
let data = '';
req.on('data', (chunk) => {data += chunk;});
req.on('end', () => {console.log(`n${data}`);
  client.close();});
req.end();

https 模块

个别我都是 nginx 反对 https,proxy_pass 到 http 的。http://nodejs.cn/api/https.html#https_https

当服务端应用

const https = require('https');
const fs = require('fs');

const options = {key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
  cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem')
};

https.createServer(options, (req, res) => {res.writeHead(200);
  res.end('你好,世界 n');
}).listen(8000);

或者

const https = require('https');
const fs = require('fs');

const options = {pfx: fs.readFileSync('test/fixtures/test_cert.pfx'),
  passphrase: '明码'
};

https.createServer(options, (req, res) => {res.writeHead(200);
  res.end('你好,世界 n');
}).listen(8000);

当客户端应用

const https = require('https');

https.get('https://encrypted.google.com/', (res) => {console.log('状态码:', res.statusCode);
  console.log('申请头:', res.headers);

  res.on('data', (d) => {process.stdout.write(d);
  });

}).on('error', (e) => {console.error(e);
});

WEB 开发框架介绍

  1. express(我常常用)
    基于 Node.js 平台,疾速、凋谢、极简的 Web 开发框架
  2. koa 目前有 1.x 和 2.0 两个版本。
    Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造,致力于成为 web 利用和 API 开发畛域中的一个更小、更富裕表现力、更强壮的基石。通过利用 async 函数,Koa 帮你抛弃回调函数,并无力地加强错误处理。Koa 并没有捆绑任何中间件,而是提供了一套优雅的办法,帮忙您疾速而欢快地编写服务端应用程序。
  3. egg
    Egg.js 为企业级框架和利用而生 ,咱们心愿由 Egg.js 孕育出更多下层框架,帮忙开发团队和开发人员升高开发和保护老本。
  4. ThinkJS(公司外部有基于 ThinkJS 的后盾)
    ThinkJS 是一款面向未来开发的 Node.js 框架,整合了大量的我的项目最佳实际,让企业级开发变得更简略、高效。从 3.0 开始,框架底层基于 Koa 2.x 实现,兼容 Koa 的所有性能。

    • 基于 Koa 2.x,兼容 middleware
    • 内核玲珑,反对 Extend、Adapter 等插件形式
    • 性能优异,单元测试笼罩水平高
    • 内置主动编译、自动更新机制,不便疾速开发
    • 应用更优雅的 async/await 解决异步问题,不再反对 */yield
    • 从 3.2 开始反对 TypeScript
  5. nest、sails、loopback、fastify、hapi、pomelo 等等

URL 模块

用于解决与解析 URL。能够获取查问字符串、协定、hostname、锚点等等

URLSearchParams

提供对查问字符串(querystring、params、searchparams)解决, 也能够应用 qs 库解决

微信公众号:前端 linong

参考文献

  1. 前端培训目录、前端培训布局、前端培训打算
  2. https://zhuanlan.zhihu.com/p/87079561
退出移动版