@@ -77,7 +77,7 @@ request.on('data', (chunk) => {
77
77
78
78
因为 ` request ` 是一个 [ ` ReadableStream ` ] [ ] 对象,它同样也是 [ ` EventEmitter ` ] [ ] 对象。所以当有错误发生时,表现的行为是很相像的。当有错误在 ` request ` 流上发生时,它会自动激发自身的 ` 'error' ` 事件。** 如果你不去处理监听这个事件,此错误将被* 抛出* ,这导致你的程序崩溃。** 你应该无论如何都要添加 ` 'error' ` 事件去监听你的请求对象,哪怕你只是做一个日志或者用你自己的独有方式去处理(当然,最佳的处理方式是返回一些出错的信息,这已是后话了)。
79
79
80
- 当然还有一些其它的方法来 [ 处理错误 ] [ ] ,诸如其它的抽象化概念和工具等。但是你总是要意识到错误的确会发生,所以你应当处理它们 。
80
+ 在 ` request ` 流中错误的表现便是通过激发(捕获) ` 'error' ` 事件。如果你不捕获处理的话,程序一旦出错会让你的 Node.js 程序立马崩溃。因此你务必要这样做——即便你啥都不处理,只是做一个日志也行(当然,最佳实践方法实发送某种 HTTP 出错消息给客(比如出错码等),这是后话) 。
81
81
82
82
``` javascript
83
83
request .on (' error' , (err ) => {
@@ -86,11 +86,11 @@ request.on('error', (err) => {
86
86
});
87
87
```
88
88
89
- 直到现在,我们已经谈到了如何创建一个对象,如果从请求中获取方法,请求地址,请求头和请求体。当我们把它们组合到一起,它就看上去是这个样子:
89
+ 当然还有一些其它的方法来 [ 处理错误 ] [ ] :诸如其它的抽象化概念和工具等。但是你总是要意识到错误的确会发生,所以你应当处理它们。
90
90
91
91
## 我们已经聊得那么多了
92
92
93
- 如果我们运行这个示例代码,我们只能 * 接收 * 到请求但得不到 * 回应 * 。实际上,如果你在浏览器内运行这个示例,你的请求只会超时,因为服务器那边根本没有返回给客户端任何东西。
93
+ 直到现在,我们已经谈到了如何创建一个对象,如果从请求中获取方法,请求地址,请求头和请求体。当我们把它们组合到一起,它就看上去是这个样子:
94
94
95
95
``` javascript
96
96
const http = require (' http' );
@@ -110,36 +110,36 @@ http.createServer((request, response) => {
110
110
}).listen (8080 ); // Activates this server, listening on port 8080.
111
111
```
112
112
113
- 谈了那么久,我们都还没有说到 ` response ` 对象。它是一个 [ ` ServerResponse ` ] [ ] 实例,而 ServerRespose 又是 [ ` WritableStream ` ] [ ] 。它包含了很多方法可以用以把数据返回给客户端。我们下面就将涉及到此议题 。
113
+ 如果我们运行这个示例代码,我们只能 * 接收 * 到请求但得不到 * 回应 * 。实际上,如果你在浏览器内运行这个示例,你的请求只会超时,因为服务器那边根本没有返回给客户端任何东西 。
114
114
115
- 如果你嫌麻烦不想设置它,返回客户端的默认状态码总是 200。当然,不是每个 HTTP 返回码必须都是 200,在某些情况下你一定希望返回一个不同的状态码,所以你应该设置 ` statusCode ` 属性 。
115
+ 谈了那么久,我们都还没有说到 ` response ` 对象。它是一个 [ ` ServerResponse ` ] [ ] ,实例,而 ServerRespose 又是 [ ` WritableStream ` ] [ ] 。它包含了很多方法可以用以把数据返回给客户端。我们下面就将涉及到此议题 。
116
116
117
117
## HTTP 状态码
118
118
119
- 我们同样也有其它捷径去做这件事,后面我们会很快看到 。
119
+ 如果你嫌麻烦不想设置它,返回客户端的默认状态码总是 200。当然,不是每个 HTTP 返回码必须都是 200,在某些情况下你一定希望返回一个不同的状态码,所以你应该设置 ` statusCode ` 属性 。
120
120
121
121
``` javascript
122
122
response .statusCode = 404 ; // Tell the client that the resource wasn't found.
123
123
```
124
124
125
- 响应头通过一个 [ ` setHeader ` ] [ ] 的属性很方便的设置 。
125
+ 我们同样也有其它捷径去做这件事,后面我们会很快看到 。
126
126
127
127
## 设置响应头
128
128
129
- 设置响应头时,它们的名字是大小写敏感的。如果你重复设置响应头,最后一次设置的值也就是系统得到的值 。
129
+ 响应头通过一个 [ ` setHeader ` ] [ ] 的属性很方便地设置 。
130
130
131
131
``` javascript
132
132
response .setHeader (' Content-Type' , ' application/json' );
133
133
response .setHeader (' X-Powered-By' , ' bacon' );
134
134
```
135
135
136
- 我们之前讨论的设置响应头以及状态码的方法建立在你使用“隐式设置”的方式,这意味着你在发送消息体之前依赖于 node 发送请求头 。
136
+ 设置响应头时,它们的名字是大小写敏感的。如果你重复设置响应头,最后一次设置的值也就是系统得到的值 。
137
137
138
138
## 显示发送头数据
139
139
140
- 如果你愿意,你可以为返回流重写响应头。为做到这点,你可以使用 [ ` writeHead ` ] [ ] 方法向消息流重写状态码和响应头 。
140
+ 我们之前讨论的设置响应头以及状态码的方法建立在你使用“隐式设置”的方式,这意味着你在发送消息体之前依赖于 node 发送请求头 。
141
141
142
- 一旦设置了响应头(无论是隐式还是显式设置),你已经为发送返回数据做好了准备 。
142
+ 如果你愿意,你可以为返回流重写响应头。为做到这点,你可以使用 [ ` writeHead ` ] [ ] ,方法向消息流重写状态码和响应头 。
143
143
144
144
``` javascript
145
145
response .writeHead (200 , {
@@ -148,11 +148,11 @@ response.writeHead(200, {
148
148
});
149
149
```
150
150
151
- 既然 ` response ` 对象是一个 [ ` WritableStream ` ] [ ] ,向客户端写入返回体只是一个普通的流方法的问题 。
151
+ 一旦设置了响应头(无论是隐式还是显式设置),你已经为发送返回数据做好了准备 。
152
152
153
153
## 发送返回体
154
154
155
- 消息流上的 ` end ` 方法同时还可以带入一些可选数据作为流上最后需要发送的一些数据,所以我们可以简单地把以上的代码做如下形式的简化:
155
+ 既然 ` response ` 对象是一个 [ ` WritableStream ` ] [ ] ,所以向客户端写入返回体只是一个普通的流方法的问题。
156
156
157
157
``` javascript
158
158
response .write (' <html>' );
@@ -163,21 +163,21 @@ response.write('</html>');
163
163
response .end ();
164
164
```
165
165
166
- ` response ` 返回流同样也会触发 ` 'error' ` 事件,某种程度上说你不得不自己去处理它。之前全部关于 ` request ` 消息流出错的处理方法在这里也同样适用。
166
+ 消息流上的 ` end ` 方法同时还可以带入一些可选数据作为流上最后需要发送的一些数据,所以我们可以简单地把以上的代码做如下形式的简化:
167
167
168
168
``` javascript
169
169
response .end (' <html><body><h1>Hello, World!</h1></body></html>' );
170
170
```
171
171
172
- > ** 注意:** 你只有在开始向返回体写数据 * 之前* 设置状态和响应头,这点很重要。 因为响应头信息总是在消息体前到达。
172
+ > ** 注意:** 你只有在开始向返回体写数据 * 之前* 设置状态和响应头,这点很重要。因为响应头信息总是在消息体前到达。
173
173
174
174
## 另一件一笔带过关于错误的事
175
175
176
- 现在既然我们已经学了如何处理 HTTP 返回信息,现在让我们把这些零碎东西组合到一起。基于先前的示例代码,我们将作出一个服务端,使它可以将从用户接受到的全部信息返回给用户。我们将通过 ` JSON.stringify ` 对消息数据进行格式化 。
176
+ ` response ` 返回流同样也会触发 ` 'error' ` 事件,某种程度上说你不得不自己去处理它。之前全部关于 ` request ` 消息流出错的处理方法在这里也同样适用 。
177
177
178
178
## 把之前所学的全部整合到一起
179
179
180
- 让我们简化之前的代码,做一个可以有响应的简单的服务端。它同样也可以把接受到的任何信息返回给客户端。我们所要做的就是从请求流中把请求数据取出,然后原样写回到返回流中即可。就如我们之前做的那么简单 。
180
+ 现在既然我们已经学了如何处理 HTTP 返回信息,现在让我们把这些零碎东西组合到一起。基于先前的示例代码,我们将作出一个服务端,使它可以将从用户接受到的全部信息返回给用户。我们将通过 ` JSON.stringify ` 对消息数据进行格式化 。
181
181
182
182
``` javascript
183
183
const http = require (' http' );
@@ -216,7 +216,7 @@ http.createServer((request, response) => {
216
216
217
217
## 服务器响应的示例代码
218
218
219
- 现在让我们调整一下,我们只对以下条件应答:
219
+ 让我们简化之前的代码,做一个可以有响应的简单的服务端。它同样也可以把接受到的任何信息返回给客户端。我们所要做的就是从请求流中把请求数据取出,然后原样写回到返回流中即可。就如我们之前做的那么简单。
220
220
221
221
``` javascript
222
222
const http = require (' http' );
@@ -232,12 +232,12 @@ http.createServer((request, response) => {
232
232
}).listen (8080 );
233
233
```
234
234
235
- 其它任何情况均返回 404。
235
+ 现在让我们调整一下,我们只对以下条件应答:
236
236
237
237
* 请求方法是 POST 方式。
238
238
* 访问路径是 ` /echo ` 。
239
239
240
- 太棒了!现在我们进一步简化它。记住, ` request ` 是一个 [ ` ReadableStream ` ] [ ] 对象, ` response ` 对象是一个 [ ` WritableStream ` ] [ ] 。那意味着我们可以使用 [ ` pipe ` ] [ ] 直接从一个流转到另外一个流。那的确是我们需要的:
240
+ 其它任何情况均返回 404。
241
241
242
242
``` javascript
243
243
const http = require (' http' );
@@ -260,7 +260,7 @@ http.createServer((request, response) => {
260
260
261
261
> ** 注意:** 为了检查请求路径,我们设计了一个路由格式。 其它形式的路由 ` switch ` ,简单的可以通过 ` switch ` 的形式检查,复杂的诸如 [ ` express ` ] [ ] 框架,如果你正在寻找路由而不需要做其它事情,简单用 [ ` router ` ] [ ] 。
262
262
263
- 就是这样!
263
+ 太棒了!现在我们进一步简化它。记住, ` request ` 是一个 [ ` ReadableStream ` ] [ ] 对象, ` response ` 对象是一个 [ ` WritableStream ` ] [ ] 对象。那意味着我们可以使用 [ ` pipe ` ] [ ] 直接从一个流转到另外一个流。那的确是我们需要的:
264
264
265
265
``` javascript
266
266
const http = require (' http' );
@@ -275,13 +275,13 @@ http.createServer((request, response) => {
275
275
}).listen (8080 );
276
276
```
277
277
278
- 我们还尚未完全完成,如之前多次谈到,错误随时可能发生,所以我们需要处理它们。
278
+ 就是这样!
279
279
280
- 为了处理请求流上的错误,我们把错误记录到 ` stderr ` 对象中,然后回发一个 400 的代码表示 ` 错误请求 ` 。在现实生活中,我们想检查分析错误,了解它们正确的状态码以及具体出错信息。具体可以参考 [ ` Error ` 文档信息 ] [ ]
280
+ 我们还尚未完全完成,如之前多次谈到,错误随时可能发生,所以我们需要处理它们。
281
281
282
- 对于返回,我们把错误日志记录到 ` stderr ` 中 。
282
+ 为了处理请求流上的错误,我们把错误记录到 ` stderr ` 对象中,然后回发一个 400 的代码表示 ` Bad Request ` 。在现实生活中,我们想检查分析错误,了解它们正确的状态码以及具体出错信息。具体可以参考 [ ` Error ` documentation ] [ ] 。
283
283
284
- 我们现在已经涉及到了大部分基本的 HTTP 请求知识,此时此刻,你应该已经具备了:
284
+ 对于返回,我们把错误日志记录到 ` stderr ` 中。
285
285
286
286
``` javascript
287
287
const http = require (' http' );
@@ -304,7 +304,7 @@ http.createServer((request, response) => {
304
304
}).listen (8080 );
305
305
```
306
306
307
- 从这些基础知识中,关于 Node.js 的 HTTP 服务一些实用案例已经逐步被构建起来,API 文档还提供了大量其它的说明,所以请详细阅读 [ ` EventEmitters ` ] [ ] , [ ` Streams ` ] [ ] 以及 [ ` HTTP ` ] [ ] 。
307
+ 我们现在已经涉及到了大部分基本的 HTTP 请求知识,此时此刻,你应该已经具备了:
308
308
309
309
* 实例化带有请求处理函数的 HTTP 服务器,并让它在端口上监听。
310
310
* 从 ` request ` 对象中获取请求头部、URL、方法和请求体等数据。
@@ -337,5 +337,5 @@ http.createServer((request, response) => {
337
337
[ `express` ] : https://www.npmjs.com/package/express
338
338
[ `router` ] : https://www.npmjs.com/package/router
339
339
[ `pipe` ] : https://nodejs.org/api/stream.html#stream_readable_pipe_destination_options
340
- [ `Error` 文档信息 ] : https://nodejs.org/api/errors.html
340
+ [ `Error` documentation ] : https://nodejs.org/api/errors.html
341
341
[ `HTTP` ] : https://nodejs.org/api/http.html
0 commit comments