- Introduction
- Chapter 1 Values, Types, and Operators
- Chapter 2 Program Structure
- Expressions and statements
- Variables
- Keywords and reserved words
- The environment
- Functions
- The console.log function
- Return values
- prompt and confirm
- Control flow
- Conditional execution
- while and do loops
- Indenting Code
- for loops
- Breaking Out of a Loop
- Updating variables succinctly
- Dispatching on a value with switch
- Capitalization
- Comments
- Summary
- Exercises
- Chapter 3 Functions
- Chapter 4 Data Structures: Objects and Arrays
- Chapter 5 Higher-Order Functions
- Chapter 6 The Secret Life of Objects
- Chapter 7 Project: Electronic Life
- Chapter 8 Bugs and Error Handling
- Chapter 9 Regular Expressions
- Creating a regular expression
- Testing for matches
- Matching a set of characters
- Repeating parts of a pattern
- Grouping subexpressions
- Matches and groups
- The date type
- Word and string boundaries
- Choice patterns
- The mechanics of matching
- Backtracking
- The replace method
- Greed
- Dynamically creating RegExp objects
- The search method
- The lastIndex property
- Parsing an INI file
- International characters
- Summary
- Exercises
- Chapter 10 Modules
- Chapter 11 Project: A Programming Language
- Chapter 12 JavaScript and the Browser
- Chapter 13 The Document Object Model
- Chapter 14 Handling Events
- Chapter 15 Project: A Platform Game
- Chapter 16 Drawing on Canvas
- Chapter 17 HTTP
- Chapter 18 Forms and Form Fields
- Chapter 19 Project: A Paint Program
- Chapter 20 Node.js
- Chapter 21 Project: Skill-Sharing Website
- Eloquent JavaScript
- Exercise Hints
- Program Structure
- Functions
- Data Structures: Objects and Arrays
- Higher-Order Functions
- The Secret Life of Objects
- Project: Electronic Life
- Bugs and Error Handling
- Regular Expressions
- Modules
- Project: A Programming Language
- The Document Object Model
- Handling Events
- Project: A Platform Game
- Drawing on Canvas
- HTTP
- Forms and Form Fields
- Project: A Paint Program
- Node.js
- Project: Skill-Sharing Website
Node.js
Content negotiation, again
Don’t forget to call the end
method on the object returned by http.request
in order to actually fire off the request.
The response object passed to http.request
’s callback is a readable stream. This means that it is not entirely trivial to get the whole response body from it. The following utility function reads a whole stream and calls a callback function with the result, using the usual pattern of passing any errors it encounters as the first argument to the callback:
function readStreamAsString(stream, callback) { var data = ""; stream.on("data", function(chunk) { data += chunk.toString(); }); stream.on("end", function() { callback(null, data); }); stream.on("error", function(error) { callback(error); }); }
Fixing a leak
It is enough to strip out all occurrences of two dots that have a slash, a backslash, or the end of the string on both sides. Using the replace
method with a regular expression is the easiest way to do this. Do not forget the g
flag on the expression, or replace
will replace only a single instance, and people could still get around this safety measure by including additional double dots in their paths! Also make sure you do the replace after decoding the string, or it would be possible to foil the check by encoding a dot or a slash.
Another potentially worrying case is when paths start with a slash, which are interpreted as absolute paths. But because urlToPath
puts a dot character in front of the path, it is impossible to create requests that result in such a path. Multiple slashes in a row, inside the path, are odd but will be treated as a single slash by the file system.
Creating directories
You can use the function that implements the DELETE
method as a blueprint for the MKCOL
method. When no file is found, try to create a directory with fs.mkdir
. When a directory exists at that path, you can return a 204 response so that directory creation requests are idempotent. If a nondirectory file exists here, return an error code. The code 400 (“bad request”) would be appropriate here.
A public space on the web
You can create a <textarea>
element to hold the content of the file that is being edited. A GET
request, using XMLHttpRequest
, can be used to get the current content of the file. You can use relative URLs like index.html, instead of http://localhost:8000/index.html , to refer to files on the same server as the running script.
Then, when the user clicks a button (you can use a <form>
element and "submit"
event or simply a "click"
handler), make a PUT
request to the same URL, with the content of the <textarea>
as request body, to save the file.
You can then add a <select>
element that contains all the files in the server’s root directory by adding <option>
elements containing the lines returned by a GET
request to the URL /
. When the user selects another file (a "change"
event on the field), the script must fetch and display that file. Also make sure that when saving a file, you use the currently selected filename.
Unfortunately, the server is too simplistic to be able to reliably read files from subdirectories since it does not tell us whether the thing we fetched with a GET
request is a regular file or a directory. Can you think of a way to extend the server to address this?
This is a book about getting computers to do what you want them to do. Computers are about as common as screwdrivers today, but they contain a lot more hidden complexity and thus are harder to operate and understand. To many, they remain alien, slightly threatening things.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论