mirror of
https://github.com/apachecn/eloquent-js-3e-zh.git
synced 2025-05-18 07:02:19 +00:00
20
This commit is contained in:
parent
1aa71a415a
commit
f73fb15033
32
20.md
32
20.md
@ -1,14 +1,26 @@
|
||||
# 二十、Node.js
|
||||
|
||||
> A student asked ‘The programmers of old used only simple machines and no programming languages, yet they made beautiful programs. Why do we use complicated machines and programming languages?’. Fu-Tzu replied ‘The builders of old used only sticks and clay, yet they made beautiful huts.’
|
||||
> 原文:[Node.js](https://eloquentjavascript.net/20_node.html)
|
||||
>
|
||||
> Master Yuan-Ma, The Book of Programming
|
||||
> 译者:[飞龙](https://github.com/wizardforcel)
|
||||
>
|
||||
> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
|
||||
>
|
||||
> 自豪地采用[谷歌翻译](https://translate.google.cn/)
|
||||
>
|
||||
> 部分参考了[《JavaScript 编程精解(第 2 版)》](https://book.douban.com/subject/26707144/)
|
||||
|
||||
> A student asked 'The programmers of old used only simple machines and no programming languages, yet they made beautiful programs. Why do we use complicated machines and programming languages?'. Fu-Tzu replied 'The builders of old used only sticks and clay, yet they made beautiful huts.'
|
||||
>
|
||||
> Master Yuan-Ma,《The Book of Programming》
|
||||
|
||||

|
||||
|
||||
到目前为止,我们已经使用了 JavaScript 语言,并将其运用于单一的浏览器环境中。本章和下一章将会大致介绍 Node.js,该程序可以让读者将你的 JavaScirpt 技能运用于浏览器之外。读者可以运用 Node.js 构建应用程序,实现简单的命令行工具和复杂动态 HTTP 服务器。
|
||||
|
||||
这些章节旨在告诉你建立 Node.js 的主要概念,并向你提供信息,使你可以采用 Nodejs 编写一些实用程序。它们并不是这个平台的完整的介绍。
|
||||
|
||||
如果你想要运行本章中的代码,需要安装 Node.js 10 或更高版本。 为此,请访问 [nodejs.org](https://nodejs.org),并按照用于你的操作系统的安装说明进行操作。 您也可以在那里找到 Node.js 的更多文档。
|
||||
如果你想要运行本章中的代码,需要安装 Node.js 10 或更高版本。 为此,请访问 [nodejs.org](https://nodejs.org),并按照用于你的操作系统的安装说明进行操作。 你也可以在那里找到 Node.js 的更多文档。
|
||||
|
||||
## 背景
|
||||
|
||||
@ -34,7 +46,7 @@ $ node hello.js
|
||||
Hello world
|
||||
```
|
||||
|
||||
Node 中的`console.log`方法与浏览器中所做的类似,都用于打印文本片段。但在 Node 中,该方法不会将文本显示在浏览器的 JavaScript 控制台中,而显示在标准输出流中。从命令行运行`node`时,这意味着您会在终端中看到记录的值。
|
||||
Node 中的`console.log`方法与浏览器中所做的类似,都用于打印文本片段。但在 Node 中,该方法不会将文本显示在浏览器的 JavaScript 控制台中,而显示在标准输出流中。从命令行运行`node`时,这意味着你会在终端中看到记录的值。
|
||||
|
||||
若你执行`node`时不附带任何参数,`node`会给出提示符,读者可以输入 JavaScript 代码并立即看到执行结果。
|
||||
|
||||
@ -117,9 +129,9 @@ $ node
|
||||
{ x: '1', y: '2' }
|
||||
```
|
||||
|
||||
运行`npm install`后,NPM 将创建一个名为`node_modules`的目录。 该目录内有一个包含库的`ini`目录。 您可以打开它并查看代码。 当我们调用`require("ini")`时,加载这个库,我们可以调用它的`parse`属性来解析配置文件。
|
||||
运行`npm install`后,NPM 将创建一个名为`node_modules`的目录。 该目录内有一个包含库的`ini`目录。 你可以打开它并查看代码。 当我们调用`require("ini")`时,加载这个库,我们可以调用它的`parse`属性来解析配置文件。
|
||||
|
||||
默认情况下,NPM 在当前目录下安装包,而不是在中央位置。 如果您习惯于其他包管理器,这可能看起来很不寻常,但它具有优势 - 它使每个应用程序完全控制它所安装的包,并且使其在删除应用程序时,更易于管理版本和清理。
|
||||
默认情况下,NPM 在当前目录下安装包,而不是在中央位置。 如果你习惯于其他包管理器,这可能看起来很不寻常,但它具有优势 - 它使每个应用程序完全控制它所安装的包,并且使其在删除应用程序时,更易于管理版本和清理。
|
||||
|
||||
## 包文件
|
||||
|
||||
@ -241,7 +253,7 @@ server.listen(8000);
|
||||
|
||||
每次客户端尝试连接服务器时,服务器都会调用传递给`createServer`函数的参数。`request`和`response`绑定都是对象,分别表示输入数据和输出数据。`request`包含请求信息,例如该对象的`url`属性表示请求的 URL。
|
||||
|
||||
因此,当您在浏览器中打开该页面时,它会向您自己的计算机发送请求。 这会导致服务器函数运行并返回一个响应,您可以在浏览器中看到该响应。
|
||||
因此,当你在浏览器中打开该页面时,它会向你自己的计算机发送请求。 这会导致服务器函数运行并返回一个响应,你可以在浏览器中看到该响应。
|
||||
|
||||
你需要调用`response`对象的方法以将一些数据发回客户端。第一个函数调用(`writeHead`)会输出响应头(参见第十七章)。你需要向该函数传递状态码(本例中 200 表示成功)和一个对象,该对象包含协议头信息的值。该示例设置了`"Content-Type"`头,通知客户端我们将发送一个 HTML 文档。
|
||||
|
||||
@ -387,7 +399,7 @@ function urlPath(url) {
|
||||
}
|
||||
```
|
||||
|
||||
只要您建立了一个接受网络请求的程序,就必须开始关注安全问题。 在这种情况下,如果我们不小心,很可能会意外地将整个文件系统暴露给网络。
|
||||
只要你建立了一个接受网络请求的程序,就必须开始关注安全问题。 在这种情况下,如果我们不小心,很可能会意外地将整个文件系统暴露给网络。
|
||||
|
||||
文件路径在 Node 中是字符串。 为了将这样的字符串映射为实际的文件,需要大量有意义的解释。 例如,路径可能包含`"../"`来引用父目录。 因此,一个显而易见的问题来源是像`/../ secret_file`这样的路径请求。
|
||||
|
||||
@ -458,7 +470,7 @@ methods.DELETE = async function(request) {
|
||||
|
||||
当 HTTP 响应不包含任何数据时,状态码 204(“No Content”,无内容)可用于表明这一点。 由于删除的响应不需要传输任何信息,除了操作是否成功之外,在这里返回是明智的。
|
||||
|
||||
您可能想知道,为什么试图删除不存在的文件会返回成功状态代码,而不是错误。 当被删除的文件不存在时,可以说该请求的目标已经完成。 HTTP 标准鼓励我们使请求是幂等(idempotent)的,这意味着,多次发送相同请求的结果,会与一次相同。 从某种意义上说,如果你试图删除已经消失的东西,那么你试图去做的效果已经实现 - 东西已经不存在了。
|
||||
你可能想知道,为什么试图删除不存在的文件会返回成功状态代码,而不是错误。 当被删除的文件不存在时,可以说该请求的目标已经完成。 HTTP 标准鼓励我们使请求是幂等(idempotent)的,这意味着,多次发送相同请求的结果,会与一次相同。 从某种意义上说,如果你试图删除已经消失的东西,那么你试图去做的效果已经实现 - 东西已经不存在了。
|
||||
|
||||
|
||||
下面是`PUT`请求的处理器。
|
||||
@ -522,7 +534,7 @@ Node 中的所有输入输出都是异步的,除非你明确使用函数的同
|
||||
|
||||
当它有效时,将其扩展,以便当其中一个参数是目录时,它将搜索该目录及其子目录中的所有文件。
|
||||
|
||||
按照您认为合适的方式,使用异步或同步文件系统函数。 配置一些东西,以便同时请求多个异步操作可能会加快速度,但不是很大,因为大多数文件系统一次只能读取一个东西。
|
||||
按照你认为合适的方式,使用异步或同步文件系统函数。 配置一些东西,以便同时请求多个异步操作可能会加快速度,但不是很大,因为大多数文件系统一次只能读取一个东西。
|
||||
|
||||
### 目录创建
|
||||
|
||||
|
BIN
img/20-0.jpg
Normal file
BIN
img/20-0.jpg
Normal file
Binary file not shown.
After ![]() (image error) Size: 25 KiB |
Loading…
x
Reference in New Issue
Block a user