235 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			235 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								node-static
							 | 
						||
| 
								 | 
							
								===========
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								> a simple, *rfc 2616 compliant* file streaming module for [node](http://nodejs.org)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								node-static understands and supports *conditional GET* and *HEAD* requests.
							 | 
						||
| 
								 | 
							
								node-static was inspired by some of the other static-file serving modules out there,
							 | 
						||
| 
								 | 
							
								such as node-paperboy and antinode.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Synopsis
							 | 
						||
| 
								 | 
							
								--------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								var static = require('node-static');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Create a node-static server instance to serve the './public' folder
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								var file = new static.Server('./public');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								require('http').createServer(function (request, response) {
							 | 
						||
| 
								 | 
							
								    request.addListener('end', function () {
							 | 
						||
| 
								 | 
							
								        //
							 | 
						||
| 
								 | 
							
								        // Serve files!
							 | 
						||
| 
								 | 
							
								        //
							 | 
						||
| 
								 | 
							
								        file.serve(request, response);
							 | 
						||
| 
								 | 
							
								    }).resume();
							 | 
						||
| 
								 | 
							
								}).listen(8080);
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								API
							 | 
						||
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Creating a node-static Server #
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Creating a file server instance is as simple as:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								new static.Server();
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This will serve files in the current directory. If you want to serve files in a specific
							 | 
						||
| 
								 | 
							
								directory, pass it as the first argument:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								new static.Server('./public');
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								You can also specify how long the client is supposed to cache the files node-static serves:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								new static.Server('./public', { cache: 3600 });
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This will set the `Cache-Control` header, telling clients to cache the file for an hour.
							 | 
						||
| 
								 | 
							
								This is the default setting.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Serving files under a directory #
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								To serve files under a directory, simply call the `serve` method on a `Server` instance, passing it
							 | 
						||
| 
								 | 
							
								the HTTP request and response object:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js 
							 | 
						||
| 
								 | 
							
								var static = require('node-static');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var fileServer = new static.Server('./public');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								require('http').createServer(function (request, response) {
							 | 
						||
| 
								 | 
							
								    request.addListener('end', function () {
							 | 
						||
| 
								 | 
							
								        fileServer.serve(request, response);
							 | 
						||
| 
								 | 
							
								    }).resume();
							 | 
						||
| 
								 | 
							
								}).listen(8080);
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Serving specific files #
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								If you want to serve a specific file, like an error page for example, use the `serveFile` method:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								fileServer.serveFile('/error.html', 500, {}, request, response);
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This will serve the `error.html` file, from under the file root directory, with a `500` status code.
							 | 
						||
| 
								 | 
							
								For example, you could serve an error page, when the initial request wasn't found:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								require('http').createServer(function (request, response) {
							 | 
						||
| 
								 | 
							
								    request.addListener('end', function () {
							 | 
						||
| 
								 | 
							
								        fileServer.serve(request, response, function (e, res) {
							 | 
						||
| 
								 | 
							
								            if (e && (e.status === 404)) { // If the file wasn't found
							 | 
						||
| 
								 | 
							
								                fileServer.serveFile('/not-found.html', 404, {}, request, response);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								    }).resume();
							 | 
						||
| 
								 | 
							
								}).listen(8080);
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								More on intercepting errors bellow.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Intercepting errors & Listening #
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								An optional callback can be passed as last argument, it will be called every time a file
							 | 
						||
| 
								 | 
							
								has been served successfully, or if there was an error serving the file:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								var static = require('node-static');
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								var fileServer = new static.Server('./public');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								require('http').createServer(function (request, response) {
							 | 
						||
| 
								 | 
							
								    request.addListener('end', function () {
							 | 
						||
| 
								 | 
							
								        fileServer.serve(request, response, function (err, result) {
							 | 
						||
| 
								 | 
							
								            if (err) { // There was an error serving the file
							 | 
						||
| 
								 | 
							
								                console.error("Error serving " + request.url + " - " + err.message);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                // Respond to the client
							 | 
						||
| 
								 | 
							
								                response.writeHead(err.status, err.headers);
							 | 
						||
| 
								 | 
							
								                response.end();
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								    }).resume();
							 | 
						||
| 
								 | 
							
								}).listen(8080);
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Note that if you pass a callback, and there is an error serving the file, node-static
							 | 
						||
| 
								 | 
							
								*will not* respond to the client. This gives you the opportunity to re-route the request,
							 | 
						||
| 
								 | 
							
								or handle it differently.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								For example, you may want to interpret a request as a static request, but if the file isn't found,
							 | 
						||
| 
								 | 
							
								send it to an application.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								If you only want to *listen* for errors, you can use *event listeners*:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								fileServer.serve(request, response).addListener('error', function (err) {
							 | 
						||
| 
								 | 
							
								    console.error("Error serving " + request.url + " - " + err.message);
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								With this method, you don't have to explicitly send the response back, in case of an error.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Options when creating an instance of `Server` #
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#### `cache` #
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Sets the `Cache-Control` header.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								example: `{ cache: 7200 }`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Passing a number will set the cache duration to that number of seconds.
							 | 
						||
| 
								 | 
							
								Passing `false` will disable the `Cache-Control` header.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								> Defaults to `3600`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#### `serverInfo` #
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Sets the `Server` header.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								example: `{ serverInfo: "myserver" }`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								> Defaults to `node-static/{version}`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#### `headers` #
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Sets response headers.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								example: `{ 'X-Hello': 'World!' }`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								> defaults to `{}`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#### `gzip` #
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Enable support for sending compressed responses.  This will enable a check for a
							 | 
						||
| 
								 | 
							
								file with the same name plus '.gz' in the same folder.  If the compressed file is
							 | 
						||
| 
								 | 
							
								found and the client has indicated support for gzip file transfer, the contents
							 | 
						||
| 
								 | 
							
								of the .gz file will be sent in place of the uncompressed file along with a
							 | 
						||
| 
								 | 
							
								Content-Encoding: gzip header to inform the client the data has been compressed.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								example: `{ gzip: true }`
							 | 
						||
| 
								 | 
							
								example: `{ gzip: /^\/text/ }`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Passing `true` will enable this check for all files.
							 | 
						||
| 
								 | 
							
								Passing a RegExp instance will only enable this check if the content-type of the
							 | 
						||
| 
								 | 
							
								respond would match that RegExp using its test() method.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								> Defaults to `false`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#### `indexFile` #
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Choose a custom index file when serving up directories.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								example: `{ indexFile: "index.htm" }`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								> Defaults to `index.html`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Command Line Interface
							 | 
						||
| 
								 | 
							
								----------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`node-static` also provides a CLI.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Installation #
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```sh
							 | 
						||
| 
								 | 
							
								$ npm install -g node-static
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Example Usage #
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```sh
							 | 
						||
| 
								 | 
							
								# serve up the current directory
							 | 
						||
| 
								 | 
							
								$ static
							 | 
						||
| 
								 | 
							
								serving "." at http://127.0.0.1:8080
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# serve up a different directory
							 | 
						||
| 
								 | 
							
								$ static public
							 | 
						||
| 
								 | 
							
								serving "public" at http://127.0.0.1:8080
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# specify additional headers (this one is useful for development)
							 | 
						||
| 
								 | 
							
								$ static -H '{"Cache-Control": "no-cache, must-revalidate"}'
							 | 
						||
| 
								 | 
							
								serving "." at http://127.0.0.1:8080
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# set cache control max age
							 | 
						||
| 
								 | 
							
								$ static -c 7200
							 | 
						||
| 
								 | 
							
								serving "." at http://127.0.0.1:8080
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# expose the server to your local network
							 | 
						||
| 
								 | 
							
								$ static -a 0.0.0.0
							 | 
						||
| 
								 | 
							
								serving "." at http://0.0.0.0:8080
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# show help message, including all options
							 | 
						||
| 
								 | 
							
								$ static -h
							 | 
						||
| 
								 | 
							
								```
							 |