前端最根底的就是 HTML+CSS+Javascript
。把握了这三门技术就算入门,但也仅仅是入门,当初前端开发的定义曾经远远不止这些。前端小课堂(HTML/CSS/JS
),本着晋升技术水平,打牢基础知识的中心思想,咱们开课啦(每周四)。
HTTP模块、WEB开发框架介绍、URL & querystring
HTTP 模块
nodejs 中分为 HTTP、HTTPS、HTTP2 三个模块,是不是头秃。
const http = require('http');
,作为一般 http/1 的API。
Node.js 中的 HTTP 接口旨在反对许多传统上难以使用的协定的个性。
特地是,大块的(且可能是块编码的)音讯。
接口永远不会缓冲整个申请或响应,所以用户能够流式地传输数据。
能够用来作为 HTTP 服务器或者客户端。const http2 = require('http2');
, 外围 API 提供了专门针对反对 HTTP/2 协定的个性而设计的底层接口。 它不是专门设计为与现有的 HTTP/1 模块 API 兼容。 当然,也有兼容的 API。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 来起服务。
- proxy.headersTimeout 限度解析器期待接管残缺 HTTP 申请头的工夫。如果不流动,则实用
server.timeout
中定义的规定。 然而,如果申请头发送速度十分慢(默认状况下,每 2 分钟最多一个字节),那么基于不流动的超时依然容许连贯放弃关上状态。 为了避免这种状况,每当申请头数据达到时,进行额定的查看,自建设连贯以来,没有超过server.headersTimeout
毫秒。 如果查看失败,则在服务器对象上触发'timeout'
事件,并且(默认状况下)套接字被销毁。 无关如何自定义超时行为的详细信息,请参见server.timeout
。 - 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开发框架介绍
- express (我常常用)
基于 Node.js 平台,疾速、凋谢、极简的 Web 开发框架 - koa 目前有1.x和2.0两个版本。
Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 利用和 API 开发畛域中的一个更小、更富裕表现力、更强壮的基石。 通过利用 async 函数,Koa 帮你抛弃回调函数,并无力地加强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的办法,帮忙您疾速而欢快地编写服务端应用程序。 - egg
Egg.js 为企业级框架和利用而生,咱们心愿由 Egg.js 孕育出更多下层框架,帮忙开发团队和开发人员升高开发和保护老本。 ThinkJS (公司外部有基于 ThinkJS 的后盾)
ThinkJS 是一款面向未来开发的 Node.js 框架,整合了大量的我的项目最佳实际,让企业级开发变得更简略、高效。从 3.0 开始,框架底层基于 Koa 2.x 实现,兼容 Koa 的所有性能。- 基于 Koa 2.x,兼容 middleware
- 内核玲珑,反对 Extend、Adapter 等插件形式
- 性能优异,单元测试笼罩水平高
- 内置主动编译、自动更新机制,不便疾速开发
- 应用更优雅的
async/await
解决异步问题,不再反对*/yield
- 从 3.2 开始反对 TypeScript
- nest、sails、loopback、fastify、hapi、pomelo 等等
URL 模块
用于解决与解析 URL。 能够获取查问字符串、协定、hostname、锚点等等
URLSearchParams
提供对查问字符串(querystring、params、searchparams)解决,也能够应用 qs 库解决。
微信公众号:前端linong
参考文献
- 前端培训目录、前端培训布局、前端培训打算
- https://zhuanlan.zhihu.com/p/87079561