您的位置:首页 > 其它

Express 4.x API---(2)

2015-11-23 11:31 281 查看

Request

req
对象代表了一个HTTP请求,其具有一些属性来保存请求中的一些数据,比如
query string
parameters
body
HTTP headers
等等。在本文档中,按照惯例,这个对象总是简称为
req
(http响应简称为
res
),但是它们实际的名字由这个回调方法在那么使用时的参数决定。

如下例子:

[code]    app.get('/user/:id', function(req, res) {
        res.send('user' + req.params.id);
    });


其实你也可以这样写:

[code]    app.get('/user/:id', function(request, response) {
        response.send('user' + request.params.id);
    });


Properties

Express 4
中,
req.files
默认在
req
对象中不再是可用的。为了通过
req.files
对象来获得上传的文件,你可以使用一个
multipart-handling
(多种处理的工具集)中间件,比如
busboy
multer
formidable
multipraty
connect-multiparty
或者
pez


req.app

这个属性持有
express
程序实例的一个引用,其可以作为中间件使用。

如果你按照这个模式,你创建一个模块导出一个中间件,这个中间件只在你的主文件中
require()
它,那么这个中间件可以通过
req.app
来获取express的实例。

例如:

[code]    // index.js
    app.get("/viewdirectory", require('./mymiddleware.js'));


req.baseUrl

一个路由实例挂载的Url路径。

[code]    var greet = express.Router();
    greet.get('/jp', function(req, res) {
        console.log(req.baseUrl); // greet
        res.send('Konichiwa!');
    });
    app.use('/greet', greet);


即使你使用的路径模式或者一系列路径模式来加载路由,
baseUrl
属性返回匹配的字符串,而不是路由模式。下面的例子,
greet
路由被加载在两个路径模式上。

[code]app.use(['/gre+t', 'hel{2}o'], greet); // load the on router on '/gre+t' and '/hel{2}o'


当一个请求路径是
/greet/jp
baseUrl
/greet
,当一个请求路径是
/hello/jp
req.baseUrl
/hello


req.baseUrl
app
对象的mountpath属性相似,除了
app.mountpath
返回的是路径匹配模式。

req.body

在请求的body中保存的是提交的一对对键值数据。默认情况下,它是
undefined
,当你使用比如
body-parser
multer
解析
body
数据的中间件时,它是填充的。

下面的例子,给你展示了怎么使用
body-parser
中间件来填充
req.body


[code]    var app = require('express');
    var bodyParser = require('body-parser');
    var multer = require('multer');// v1.0.5
    var upload = multer(); // for parsing multipart/form-data
    app.use(bodyParser.json()); // for parsing application/json
    app.use(bodyParser.urlencoded({extended:true})); // for parsing application/x-www-form-urlencoded

    app.post('/profile', upload.array(), function(req, res, next) {
        console.log(req.body);
        res.json(req.body);
    });


req.cookies

当使用
cookie-parser
中间件的时候,这个属性是一个对象,其包含了请求发送过来的
cookies
。如果请求没有带
cookies
,那么其值为
{}


[code]    // Cookie: name=tj
    req.cookies.name
    // => "tj"


获取更多信息,问题,或者关注,可以查阅cookie-parser

req.fresh

指示这个请求是否是新鲜的。其和
req.stale
是相反的。

cache-control
请求头没有
no-cache
指示和下面中的任一一个条件为
true
,那么其就为
true


if-modified-since
请求头被指定,和
last-modified
请求头等于或者早于
modified
请求头。

if-none-match
请求头是
*


if-none-match
请求头在被解析进它的指令之后,不匹配
etag
回复头(完全不知道什么鬼)。

[code]    req.fresh
    // => true


req.hostname

包含了源自
Host
HTTP头部的
hostname


trust proxy
设置项被设置为启用值,
X-Forwarded-Host
头部被使用来代替
Host
。这个头部可以被客户端或者代理设置。

[code]// Host: "example.com"
req.hostname
// => "example.com"


req.ips

trust proxy
设置项被设置为启用值,这个属性包含了一组在
X_Forwarded-For
请求头中指定的IP地址。不然,其就包含一个空的数组。这个头部可以被客户端或者代理设置。

例如,如果
X-Forwarded-For
client
proxy1
proxy2
req.ips
就是
["clinet", "proxy1", "proxy2"]
,这里
proxy2
就是最远的下游。

req.originalUrl

req.url
不是一个原生的
Express
属性,它继承自Node’s http module

这个属性很像
req.url
;然而,其保留了原版的请求链接,允许你自由地重定向
req.url
到内部路由。比如,
app.use()
mounting
特点可以重定向
req.url
跳转到挂载点。

[code]// GET /search?q=something
req.originalUrl
// => "/search?q=something"


req.params

一个对象,其包含了一系列的属性,这些属性和在路由中命令的参数名是一一对应的。例如,如果你有
/user/:name
路由,
name
属性可作为
req.params.name
。这个对象默认值为
{}


[code]// GET /user/tj
req.params.name
// => "tj"


当你使用正则表达式来定义路由规则,捕获组的组合一般使用
req.params
,这里的
n
是第几个捕获租。这个规则被施加在无名通配符匹配,比如
/file/*
的路由:

[code]// GET /file/javascripts/jquery.js
req.params[0]
// => "javascripts/jquery.js"


req.path

包含请求URL的部分路径。

[code]// example.com/users?sort=desc
req.path
// => "/users"


当在一个中间件中被调用,挂载点不包含在
req.path
中。你可以查阅app.use()获得跟多的信息。

req.protocol

请求的协议,一般为
http
,当启用TLS加密,则为
https


trust proxy
设置一个启用的参数,如果存在
X-Forwarded-Proto
头部的话,其将被信赖和使用。这个头部可以被客户端或者代理设置。

[code]req.ptotocol
// => "http"


req.query

一个对象,为每一个路由中的
query string
参数都分配一个属性。如果没有
query string
,它就是一个空对象,
{}


[code]// GET /search?q=tobi+ferret
req.query.a
// => "tobi ferret"

// GET /shoes?order=desc&shoe[color]=blue&shoe[type]=converse
req.query.order
// => "desc"

req.query.shoe.color
// => "blue"

req.query.shoe.type
// => "converse"


req.route

当前匹配的路由,其为一串字符。比如:

[code]app.get('/user/:id?', function userIdHandler(req, res) {
    console.log(req.route);
    res.send('GET')
})


前面片段的输出为:

[code]{ path:"/user/:id?"
    stack:
    [
        { handle:[Function:userIdHandler],
          name:"userIdHandler",
          params:undefined,
          path:undefined,
          keys:[],
          regexp:/^\/?$/i,
          method:'get'
        }
    ]
    methods:{get:true}
}


req.secure

一个布尔值,如果建立的是TLS的连接,那么就为
true
。等价与:

[code]    'https' == req.protocol;


req.signedCookies

当使用
cookie-parser
中间件的时候,这个属性包含的是请求发过来的签名
cookies
,不签名的并且为使用做好了准备(这句真不知道怎么翻译了…)。签名
cookies
驻留在不同的对象中来体现开发者的意图;不然,一个恶意攻击可以被施加在
req.cookie
值上(它是很容易被欺骗的).记住,签名一个
cookie
不是把它藏起来或者加密;而是简单的防止篡改(因为签名使用的加密是私人的)。如果没有发送签名的
cookie
,那么这个属性默认为
{}


[code]// Cookie: user=tobi.CP7AWaXDfAKIRfH49dQzKJx7sKzzSoPq7/AcBBRVwlI3
req.signedCookies.user
// => "tobi"


为了获取更多的信息,问题或者关注,可以参阅cookie-parser

req.stale

指示这个请求是否是
stale
(陈旧的),它与
req.fresh
是相反的。更多信息,可以查看req.fresh

[code]req.stale
// => true


req.subdomains

请求中域名的子域名数组。

[code]// Host: "tobi.ferrets.example.com"
req.subdomains
// => ["ferrets", "tobi"]


req.xhr

一个布尔值,如果
X-Requested-With
的值为
XMLHttpRequest
,那么其为
true
,其指示这个请求是被一个客服端库发送,比如
jQuery


[code]req.xhr
// => true


Methods

req.accepts(types)

检查这个指定的内容类型是否被接受,基于请求的
Accept
HTTP头部。这个方法返回最佳匹配,如果没有一个匹配,那么其返回
undefined
(在这个case下,服务器端应该返回406和”Not Acceptable”)。

type
值可以是一个单的
MIME type
字符串(比如
application/json
),一个扩展名比如
json
,一个逗号分隔的列表,或者一个数组。对于一个列表或者数组,这个方法返回最佳项(如果有的话)。

[code]// Accept: text/html
req.accepts('html');
// => "html"

// Accept: text/*, application/json
req.accepts('html');
// => "html"

req.accepts('text/html');
// => "text/html"

req.accepts(['json', 'text']);
// => "json"

req.accepts('application/json');
// => "application/json"

// Accept: text/*, application/json
req.accepts('image/png');
req.accepts('png');
// => undefined

// Accept: text/*;q=.5, application/json
req.accepts(['html', 'json']);
// => "json"


获取更多信息,或者如果你有问题或关注,可以参阅accepts

req.acceptsCharsets(charset[, …])

返回指定的字符集集合中第一个的配置的字符集,基于请求的
Accept-Charset
HTTP头。如果指定的字符集没有匹配的,那么就返回false。

获取更多信息,或者如果你有问题或关注,可以参阅accepts

req.acceptsEncodings(encoding[, …])

返回指定的编码集合中第一个的配置的编码集,基于请求的
Accept-Encoding
HTTP头。如果指定的编码集没有匹配的,那么就返回false。

获取更多信息,或者如果你有问题或关注,可以参阅accepts

req.acceptsLanguages(lang [, …])

返回指定的语言集合中第一个的配置的编码集,基于请求的
Accept-Language
HTTP头。如果指定的语言集没有匹配的,那么就返回false。

获取更多信息,或者如果你有问题或关注,可以参阅accepts

req.get(field)

返回请求指定的HTTP头部的域内容(不区分大小写)。
Referrer
Referer
的域内容可互换。

[code]req.get('Content-type');
// => "text/plain"

req.get('content-type');
// => "text/plain"

req.get('Something')
// => undefined


其是
req.header(field)
的别名。

req.is(type)

如果进来的请求的
Content-type
头部域匹配参数
type
给定的
MIME type
,那么其返回
true
。否则返回
false


[code]// With Content-Type: text/html; charset=utf-8
req.is('html');
req.is('text/html');
req.is('text/*');
// => true

// When Content-Type is application/json
req.is('json');
req.is('application/json');
req.is('application/*');
// => true

req.is('html');
// => false


获取更多信息,或者如果你有问题或关注,可以参阅type-is

req.param(naem, [, defaultValue])

过时的。可以在适合的情况下,使用
req.params
,’req.body’或者
req.query


返回当前参数
name
的值。

[code]// ?name=tobi
req.param('name')
// => "tobi"

// POST name=tobi
req.param('name')
// => "tobi"
// /user/tobi for /user/:name
req.param('name')
// => "tobi"


按下面给出的顺序查找配置的:

req.params
req.body

req.query

可选的,你可以指定一个默认值来设置一个默认值,如果这个参数在任何一个请求的对象中都不能找到。

直接通过
req.params
,’req.body’,’req.query’取得应该更加的清晰-除非你确定每一个对象的输入。

Body-parser
中间件必须加载,如果你使用
req.param()
。详细请看req.body
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: