发送
Send是一个库,用于将文件系统中的文件作为http响应流式传输 支持部分响应(Ranges)、条件get协商(If-Match)、 If-Unmodified-Since, if - nonmatch, If-Modified-Since),测试覆盖率高, 以及可用于采取适当行动的粒度事件 应用程序或框架。
希望提供映射到url的整个文件夹?试一试 为静态。
安装
这是一个 node . js 模块可通过
npm注册表. 安装是使用
npm install 命令:
$ npm install send
API
var send = require('send')
发送(请求,路径,[选项])
新建一个 SendStream 对于要发送到的给定路径 res。这个 req 是
Node.js的HTTP请求和 path 是要发送的urlencoded路径(urlencoded,
不是实际的文件系统路径)。
选项
acceptRanges
启用或禁用接受远程请求,默认为true。
禁用此功能将无法发送 Accept-Ranges 忽略内容
的 Range 请求头。
cacheControl
启用或禁用设置 Cache-Control 响应头,默认为
真实的。禁用此功能将忽略 immutable 和 maxAge 选项。
.
设置遇到“dotfiles”时如何处理。dotfile是一个文件
或以点(".")开头的目录。注意这个检查是在
路径本身,而不检查该路径是否在
磁盘。如果 root ,则只有根目录上面的dotfiles是
检查(即根本身可以在dotfile设置时
“否认”)。
'allow'对dotfiles没有特殊处理。'deny'对dotfile的任何请求发送一个403。'ignore'假装dotfile不存在,然后返回404。
默认值为 类似的 来 'ignore',除了
这个默认值不会忽略目录中的文件
带圆点,用于向后兼容。
结束
流结束时的字节偏移量,默认为文件长度
- 1。结束是包含在流中的意思 end: 3 将包括
流中的第四个字节。
etag
启用或禁用etag生成,默认为true。
扩展
如果给定的文件不存在,尝试添加给定的扩展名之一,
按照给定的顺序。默认情况下,这是禁用的(设置为 false). 一个
示例值,将提供无扩展的HTML文件: ['html', 'htm']。
如果请求的文件已经有扩展名,则跳过此操作。
不可变的
启用或禁用 immutable 的指令 Cache-Control 响应
头,默认为 false. 如果设置为 true, maxAge 选择应
还指定启用缓存。这个 immutable 指令将阻止
的生命周期内支持客户端发出有条件请求
maxAge 选项以检查文件是否已更改。
指数
默认情况下,send支持“index.html”文件,禁用此功能
集 false 或者提供一个新的索引,传递一个字符串或数组
按优先顺序。
lastModified
启用或禁用 Last-Modified 头,默认为true。使用文件
系统上次修改的值。
maxAge
为http缓存提供以毫秒为单位的最大年龄,默认为0。 对象接受的字符串 女士 模块。
根
提供相对于 path。
开始
流开始时的字节偏移量,默认为0。开始是包容的,
意义 start: 2 将包括流中的第三个字节。
事件
这个 SendStream 是事件发射器,并将发出以下事件:
error发生错误(err)directory请求一个目录(res, path)file请求文件(path, stat)headers即将在文件上设置头文件(res, path, stat)stream文件流已开始(stream)end流媒体已经完成
.pipe
这个 pipe 方法用于将响应管道传输到Node.js的HTTP响应中
对象,通常 send(req, path, options).pipe(res)。
错误处理
默认为no error 侦听器存在时,将自动响应
否则你可以完全控制响应,也就是说你可能会显示一个5xx
页面等。
缓存
它 不 执行内部缓存时,应该使用反向代理缓存 比如清漆,或者那些叫做cdn的东西。如果你的 应用程序足够小,可以从单节点内存中获益 缓存,它足够小,根本不需要缓存;)。
调试
启用 debug() 仪表输出输出 调试:
$ DEBUG=send node app
运行测试
$ npm install
$ npm test
例子
提供一个特定的文件
这个简单的示例将向所有请求发送一个特定的文件。
var http = require('http')
var send = require('send')
var server = http.createServer(function onRequest (req, res) {
send(req, '/path/to/index.html')
.pipe(res)
})
server.listen(3000)
从一个目录提供所有文件
这个简单的示例将提供所有文件
指定目录作为顶级目录。例如,请求
GET /foo.txt 将寄回 /www/public/foo.txt。
var http = require('http')
var parseUrl = require('parseurl')
var send = require('send')
var server = http.createServer(function onRequest (req, res) {
send(req, parseUrl(req).pathname, { root: '/www/public' })
.pipe(res)
})
server.listen(3000)
自定义文件类型
var extname = require('path').extname
var http = require('http')
var parseUrl = require('parseurl')
var send = require('send')
var server = http.createServer(function onRequest (req, res) {
send(req, parseUrl(req).pathname, { root: '/www/public' })
.on('headers', function (res, path) {
switch (extname(path)) {
case '.x-mt':
case '.x-mtt':
// custom type for these extensions
res.setHeader('Content-Type', 'application/x-my-type')
break
}
})
.pipe(res)
})
server.listen(3000)
自定义目录索引视图
这是提供目录结构的一个示例 显示目录列表的自定义函数。
var http = require('http')
var fs = require('fs')
var parseUrl = require('parseurl')
var send = require('send')
// Transfer arbitrary files from within /www/example.com/public/*
// with a custom handler for directory listing
var server = http.createServer(function onRequest (req, res) {
send(req, parseUrl(req).pathname, { index: false, root: '/www/public' })
.once('directory', directory)
.pipe(res)
})
server.listen(3000)
// Custom directory handler
function directory (res, path) {
var stream = this
// redirect to trailing slash for consistent url
if (!stream.hasTrailingSlash()) {
return stream.redirect(path)
}
// get directory list
fs.readdir(path, function onReaddir (err, list) {
if (err) return stream.error(err)
// render an index for the directory
res.setHeader('Content-Type', 'text/plain; charset=UTF-8')
res.end(list.join('\n') + '\n')
})
}
从根目录提供自定义错误处理
var http = require('http')
var parseUrl = require('parseurl')
var send = require('send')
var server = http.createServer(function onRequest (req, res) {
// your custom error-handling logic:
function error (err) {
res.statusCode = err.status || 500
res.end(err.message)
}
// your custom headers
function headers (res, path, stat) {
// serve all files for download
res.setHeader('Content-Disposition', 'attachment')
}
// your custom directory handling logic:
function redirect () {
res.statusCode = 301
res.setHeader('Location', req.url + '/')
res.end('Redirecting to ' + req.url + '/')
}
// transfer arbitrary files from within
// /www/example.com/public/*
send(req, parseUrl(req).pathname, { root: '/www/public' })
.on('error', error)
.on('directory', redirect)
.on('headers', headers)
.pipe(res)
})
server.listen(3000)