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
 | |
| ```
 |