共计 4524 个字符,预计需要花费 12 分钟才能阅读完成。
前端最根底的就是 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