프로젝트

일반

사용자정보

통계
| 개정판:

root / HServer / 00.Server / 00.Program / node_modules / send / README.md

이력 | 보기 | 이력해설 | 다운로드 (8.67 KB)

1 39 HKM
# send
2
3
[![NPM Version][npm-image]][npm-url]
4
[![NPM Downloads][downloads-image]][downloads-url]
5
[![Linux Build][travis-image]][travis-url]
6
[![Windows Build][appveyor-image]][appveyor-url]
7
[![Test Coverage][coveralls-image]][coveralls-url]
8
9
Send is a library for streaming files from the file system as a http response
10
supporting partial responses (Ranges), conditional-GET negotiation (If-Match,
11
If-Unmodified-Since, If-None-Match, If-Modified-Since), high test coverage,
12
and granular events which may be leveraged to take appropriate actions in your
13
application or framework.
14
15
Looking to serve up entire folders mapped to URLs? Try [serve-static](https://www.npmjs.org/package/serve-static).
16
17
## Installation
18
19
This is a [Node.js](https://nodejs.org/en/) module available through the
20
[npm registry](https://www.npmjs.com/). Installation is done using the
21
[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
22
23
```bash
24
$ npm install send
25
```
26
27
## API
28
29
<!-- eslint-disable no-unused-vars -->
30
31
```js
32
var send = require('send')
33
```
34
35
### send(req, path, [options])
36
37
Create a new `SendStream` for the given path to send to a `res`. The `req` is
38
the Node.js HTTP request and the `path` is a urlencoded path to send (urlencoded,
39
not the actual file-system path).
40
41
#### Options
42
43
##### acceptRanges
44
45
Enable or disable accepting ranged requests, defaults to true.
46
Disabling this will not send `Accept-Ranges` and ignore the contents
47
of the `Range` request header.
48
49
##### cacheControl
50
51
Enable or disable setting `Cache-Control` response header, defaults to
52
true. Disabling this will ignore the `immutable` and `maxAge` options.
53
54
##### dotfiles
55
56
Set how "dotfiles" are treated when encountered. A dotfile is a file
57
or directory that begins with a dot ("."). Note this check is done on
58
the path itself without checking if the path actually exists on the
59
disk. If `root` is specified, only the dotfiles above the root are
60
checked (i.e. the root itself can be within a dotfile when when set
61
to "deny").
62
63
  - `'allow'` No special treatment for dotfiles.
64
  - `'deny'` Send a 403 for any request for a dotfile.
65
  - `'ignore'` Pretend like the dotfile does not exist and 404.
66
67
The default value is _similar_ to `'ignore'`, with the exception that
68
this default will not ignore the files within a directory that begins
69
with a dot, for backward-compatibility.
70
71
##### end
72
73
Byte offset at which the stream ends, defaults to the length of the file
74
minus 1. The end is inclusive in the stream, meaning `end: 3` will include
75
the 4th byte in the stream.
76
77
##### etag
78
79
Enable or disable etag generation, defaults to true.
80
81
##### extensions
82
83
If a given file doesn't exist, try appending one of the given extensions,
84
in the given order. By default, this is disabled (set to `false`). An
85
example value that will serve extension-less HTML files: `['html', 'htm']`.
86
This is skipped if the requested file already has an extension.
87
88
##### immutable
89
90
Enable or diable the `immutable` directive in the `Cache-Control` response
91
header, defaults to `false`. If set to `true`, the `maxAge` option should
92
also be specified to enable caching. The `immutable` directive will prevent
93
supported clients from making conditional requests during the life of the
94
`maxAge` option to check if the file has changed.
95
96
##### index
97
98
By default send supports "index.html" files, to disable this
99
set `false` or to supply a new index pass a string or an array
100
in preferred order.
101
102
##### lastModified
103
104
Enable or disable `Last-Modified` header, defaults to true. Uses the file
105
system's last modified value.
106
107
##### maxAge
108
109
Provide a max-age in milliseconds for http caching, defaults to 0.
110
This can also be a string accepted by the
111
[ms](https://www.npmjs.org/package/ms#readme) module.
112
113
##### root
114
115
Serve files relative to `path`.
116
117
##### start
118
119
Byte offset at which the stream starts, defaults to 0. The start is inclusive,
120
meaning `start: 2` will include the 3rd byte in the stream.
121
122
#### Events
123
124
The `SendStream` is an event emitter and will emit the following events:
125
126
  - `error` an error occurred `(err)`
127
  - `directory` a directory was requested `(res, path)`
128
  - `file` a file was requested `(path, stat)`
129
  - `headers` the headers are about to be set on a file `(res, path, stat)`
130
  - `stream` file streaming has started `(stream)`
131
  - `end` streaming has completed
132
133
#### .pipe
134
135
The `pipe` method is used to pipe the response into the Node.js HTTP response
136
object, typically `send(req, path, options).pipe(res)`.
137
138
### .mime
139
140
The `mime` export is the global instance of of the
141
[`mime` npm module](https://www.npmjs.com/package/mime).
142
143
This is used to configure the MIME types that are associated with file extensions
144
as well as other options for how to resolve the MIME type of a file (like the
145
default type to use for an unknown file extension).
146
147
## Error-handling
148
149
By default when no `error` listeners are present an automatic response will be
150
made, otherwise you have full control over the response, aka you may show a 5xx
151
page etc.
152
153
## Caching
154
155
It does _not_ perform internal caching, you should use a reverse proxy cache
156
such as Varnish for this, or those fancy things called CDNs. If your
157
application is small enough that it would benefit from single-node memory
158
caching, it's small enough that it does not need caching at all ;).
159
160
## Debugging
161
162
To enable `debug()` instrumentation output export __DEBUG__:
163
164
```
165
$ DEBUG=send node app
166
```
167
168
## Running tests
169
170
```
171
$ npm install
172
$ npm test
173
```
174
175
## Examples
176
177
### Small example
178
179
```js
180
var http = require('http')
181
var parseUrl = require('parseurl')
182
var send = require('send')
183
184
var server = http.createServer(function onRequest (req, res) {
185
  send(req, parseUrl(req).pathname).pipe(res)
186
})
187
188
server.listen(3000)
189
```
190
191
### Custom file types
192
193
```js
194
var http = require('http')
195
var parseUrl = require('parseurl')
196
var send = require('send')
197
198
// Default unknown types to text/plain
199
send.mime.default_type = 'text/plain'
200
201
// Add a custom type
202
send.mime.define({
203
  'application/x-my-type': ['x-mt', 'x-mtt']
204
})
205
206
var server = http.createServer(function onRequest (req, res) {
207
  send(req, parseUrl(req).pathname).pipe(res)
208
})
209
210
server.listen(3000)
211
```
212
213
### Custom directory index view
214
215
This is a example of serving up a structure of directories with a
216
custom function to render a listing of a directory.
217
218
```js
219
var http = require('http')
220
var fs = require('fs')
221
var parseUrl = require('parseurl')
222
var send = require('send')
223
224
// Transfer arbitrary files from within /www/example.com/public/*
225
// with a custom handler for directory listing
226
var server = http.createServer(function onRequest (req, res) {
227
  send(req, parseUrl(req).pathname, {index: false, root: '/www/example.com/public'})
228
  .once('directory', directory)
229
  .pipe(res)
230
})
231
232
server.listen(3000)
233
234
// Custom directory handler
235
function directory (res, path) {
236
  var stream = this
237
238
  // redirect to trailing slash for consistent url
239
  if (!stream.hasTrailingSlash()) {
240
    return stream.redirect(path)
241
  }
242
243
  // get directory list
244
  fs.readdir(path, function onReaddir (err, list) {
245
    if (err) return stream.error(err)
246
247
    // render an index for the directory
248
    res.setHeader('Content-Type', 'text/plain; charset=UTF-8')
249
    res.end(list.join('\n') + '\n')
250
  })
251
}
252
```
253
254
### Serving from a root directory with custom error-handling
255
256
```js
257
var http = require('http')
258
var parseUrl = require('parseurl')
259
var send = require('send')
260
261
var server = http.createServer(function onRequest (req, res) {
262
  // your custom error-handling logic:
263
  function error (err) {
264
    res.statusCode = err.status || 500
265
    res.end(err.message)
266
  }
267
268
  // your custom headers
269
  function headers (res, path, stat) {
270
    // serve all files for download
271
    res.setHeader('Content-Disposition', 'attachment')
272
  }
273
274
  // your custom directory handling logic:
275
  function redirect () {
276
    res.statusCode = 301
277
    res.setHeader('Location', req.url + '/')
278
    res.end('Redirecting to ' + req.url + '/')
279
  }
280
281
  // transfer arbitrary files from within
282
  // /www/example.com/public/*
283
  send(req, parseUrl(req).pathname, {root: '/www/example.com/public'})
284
  .on('error', error)
285
  .on('directory', redirect)
286
  .on('headers', headers)
287
  .pipe(res)
288
})
289
290
server.listen(3000)
291
```
292
293
## License
294
295
[MIT](LICENSE)
296
297
[npm-image]: https://img.shields.io/npm/v/send.svg
298
[npm-url]: https://npmjs.org/package/send
299
[travis-image]: https://img.shields.io/travis/pillarjs/send/master.svg?label=linux
300
[travis-url]: https://travis-ci.org/pillarjs/send
301
[appveyor-image]: https://img.shields.io/appveyor/ci/dougwilson/send/master.svg?label=windows
302
[appveyor-url]: https://ci.appveyor.com/project/dougwilson/send
303
[coveralls-image]: https://img.shields.io/coveralls/pillarjs/send/master.svg
304
[coveralls-url]: https://coveralls.io/r/pillarjs/send?branch=master
305
[downloads-image]: https://img.shields.io/npm/dm/send.svg
306
[downloads-url]: https://npmjs.org/package/send