NodeJS:快速入门



大家好!很快,Node.js开发人员课程将开始,与此相关的是我们进行了传统的公开课程网络研讨会检查了Node的优缺点,还讨论了该软件平台最适合哪些任务,以及应选择其他语言和框架。当然,并非没有实践。运行示例和安装Node.js所需的软件

讲师-Alexander Korzhikov,荷兰国际集团(ING Group)的开发IT工程师。






关于Node.js的几句话


Node.js是一个基于事件循环和面向事件的体系结构等概念的异步JavaScript运行时。Node.js平台和标准的NPM软件包管理器使您可以为各种主题领域(从Web到机器学习)创建有效的应用程序。

最简单的Web服务器示例(node server.js):

const http = require('http')
const hostname = '127.0.0.1'
const port = 3000
const server = http.createServer((req, res) => {
res.statusCode = 200
res.setHeader('Content-Type', 'text/plain')
res.end('Hello World\n')
})
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`)
})

查看上面的代码,可以注意到Node.js的以下功能:

  1. 我们可以直接在服务器上运行JavaScript代码,也就是说,可以使用node命令执行JavaScript文件。
  2. 支持用于加载依赖项的模块和ES模块的CommonJS格式,并且两种格式都可以使用。
  3. 支持标准模块库,HTTP是其中的一部分。
  4. 该API基于异步回调模式,但也支持Promise。
  5. 支持ES2015语法。顺便说一下,这是一个有用的链接,您可以始终通过它查看在哪个版本的Node中支持JS功能如果出现问题,您可以比较并了解问题所在。

不要错过小演示(VSCode + Chrome Debug)。

短暂的历史之旅


Node.js平台于2009年问世,该项目的主要开发者和创建者是Ryan Dahl。他的主要思想是使用JavaScript为服务器创建非阻塞I / O(输入输出)。当时,这种方法还不是很普遍,JavaScript是最好的解决方案之一。

Node.js本身使用Chromium引擎,或者说,其中一部分解释了JavaScript- V8由于解释器一次将一个单独的V8项目分离出来,因此可以在其周围简单地创建一个生态系统。严格来说,这正是Node.js的创建者Ryan Dahl所做的。顺便说一下,今天有一个支持该项目的组织Node.js Foundation。



结构体


首先,该库是用C ++和JavaScript编写的。该项目本身位于GitHub上,因此如果您好奇,可以熟悉其源代码。可以花很长时间研究它)。

其次,如前所述,它包括V8(来自Google的JavaScript执行平台)和libuv作为事件循环(异步事件循环)的一部分。

好吧,当然,有用于操作系统的各种模块,它们使您可以执行所需的那些业务任务。

还值得一提的是Node.js中常用的主要设计模式:

  • 回调(已经提到过);
  • 观察者(简单的事件模式);
  • 模块(尽管现在它是用JavaScript语言本身组织的,但在Node.js中仍然有用);
  • Reactor(在不阻塞代码主流时与某些资源进行异步交互的模式)。JS开发人员熟悉此模式。例如,如果我们在浏览器中工作并编写前端,则我们不会阻止所有浏览器工作,而只是订阅用户的事件,并且当事件发生时(在“单击”,“输入”等之后),我们执行我们的代码。

顺便说一下,这是我们在网络研讨会上的一些竞争))。继续前进。

节点标准分发模块




您知道标准Node发行版中包含哪些模块吗?也就是说,我们谈论的是已经内置的模块,因此无法安装它们。通常,其中大约有50个,让我们列出主要的。为了便于理解,我们通常将其分为5点:

1.主要(用于常规操作):

  • fs;
  • 计时器
  • 流(用于处理流)。

2.实用程序:

  • 路径(用于处理路径);
  • util;
  • zlib(存档和解压缩);
  • 加密(用于加密功能)。

3.流程(与多处理和并行性有关的所有内容):

  • child_process(用于启动次模块的主要模块,为启动和监视进程提供了很大的机会);
  • 集群(类似于第一个集群,但允许您并行化处理器内核上的任务);
  • worker_threads(线程或线程的实现,但是它不是完全线程安全的,但是为什么更好地阅读文档)。

4.协议(各种协议):

  • http(s);
  • 净;
  • dns。

5.系统(分别为系统模块,包括调试):

  • 操作系统
  • v8;
  • async_hooks;
  • perf_hooks;
  • trace_events

还有什么要补充的:

-全局对象-窗口的类似物;
-浏览器中可用的所有JavaScript对象在Node.js中也可用;
-超时-几乎就像在浏览器中一样;
-过程-当前过程的表示;
-控制台可用。

回呼


回调-作为参数传递给代码的函数,涉及在某个时间点执行该函数。顺便说一句,人们很少认为他们的执行可以是同步的或异步的。

const server = http.createServer((req, res) => {
res.statusCode = 200
res.setHeader('Content-Type', 'text/plain')
res.end('Hello World\n')
})
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`)
})

在Node中,默认情况下,回调以“错误”执行,并且结果是异步的:

fs.readFile('/etc/passwd', (err, data) => {
if (err) throw err
console.log(data)
})

这就是反模式的样子-一个正确使用回调的很好的例子。正如他们所说的,经典的回调地狱

fs.readdir(source, function (err, files) {
if (err) {
console.log('Error finding files: ' + err)
} else {
files.forEach(function (filename, fileIndex) {
console.log(filename)
gm(source + filename).size(function (err, values) {
if (err) {
console.log('Error identifying file size: ' + err)
} else {
console.log(filename + ' : ' + values)
aspect = (values.width / values.height)
widths.forEach(function (width, widthIndex) {
height = Math.round(width / aspect)
console.log('resizing ' + filename + 'to ' + height + 'x' + height)
this.resize(width, height).write(dest + 'w' + width + '_' + filename, function(err) {
if (err) console.log('Error writing file: ' + err)
})
}.bind(this))
}
})
})
}
})

现在,让我们看看如何创建一个简单的Web服务器并将HTML索引呈现为客户端响应:

const http = require('http')
const server = http.createServer((req, res) => {
res.statusCode = 200
res.setHeader('Content-Type', 'text/plain')
res.end('Hello World\n')
})

读取本地html文件:

const fs = require('fs')
fs.readFile('./index.html', (err, text) => {
console.log(text)
})

完成回调的主题后,我想提到回调类型。如果存在错误,有些回调仅返回错误:

fs.access('/etc/passwd', fs.constants.R_OK, (err) => {
console.log(err ? 'no access!' : 'read')
})

同样,现在,越来越多的模块和API可以立即使用Promises,这很好。节点支持承诺:

util.promisify()
fs.promises.*

返回类型:

http.request('https://example.com', (error, response, body) => {
...
})

节点问答


编写Web服务器时,尽管有许多实现类似功能的其他库和框架,但经常使用Express。尽管如此,Express是最受欢迎和稳定的。您可以说这是编写服务器的标准。

import express from "express";
const app = express();
const port = 3000;
app.get("/", (req, res) => {
res.send("Hello World!");
});
app.listen(port, () => {
console.log(`Example app listening
});



好了,现在您可以尝试自己使用Express生成器创建Web服务器

  • 使用玉器,cookie会话;
  • 天真的登录注销。

或者只是看看老师是如何做到的,他 TypeScript 准备了现成的解决方案

就这样。最后-几个有用的链接:


在球场上

All Articles