express 四.x Api 粤语版-最新汉语详细分解

hi.py的提供的路由装饰器接受八个参数,第3个参数钦定动态路由的正则方式,第二个参数钦命同意的http请求方法列表。

依赖hi-nginx的web开拓(python篇)——动态路由和呼吁方法,hi-nginxpython

hi.py
的提供的路由装饰器接受五个参数,首个参数钦赐动态路由的正则格局,第一个参数钦定同意的http请求方法列表。

比如:

1 @app.route(r"^/client/?$",['GET','POST'])
2 def client(req,res,param):
3     res.content('{}<br>{}<br>{}<br>{}<br>{}'.format(req.client(),req.method(),req.uri(),req.user_agent(),req.param()))
4     res.status(200)

那些路由钦命uri为/client大概/client/,同时伸手方法为GET只怕POST的http请求由函数client(req,res,param)来管理。uri格局由正则表明式构成,请求方法参数由贰个list表示,可接受的办法名包蕴:GET,POST,PUT,HEAD,PATCH等,凡nginx能精晓的http方法名均可。

管理函数有八个参数,分别是req,res和param。它们分别是hi_req,hi_res和由正则表达式引出的group
dict。前两者是有hi-nginx提供的api,它们提供1多级措施来操控http协议:

安装:

Address:https://www.zybuluo.com/XiangZhou/note/208532

比如:

hi_req

  • uri
  • method
  • client
  • param
  • user_agent
  • has_header
  • get_header
  • has_form
  • get_form
  • has_session
  • get_session
  • has_cookie
  • get_cookie

新本子中命令行工具分家了

Express 4.x API
express
翻译
api文档
中文

1 @app.route(r"^/client/?$",['GET','POST'])
2 def client(req,res,param):
3     res.content('{}<br>{}<br>{}<br>{}<br>{}'.format(req.client(),req.method(),req.uri(),req.user_agent(),req.param()))
4     res.status(200)

hi_res

  • status
  • content
  • header
  • session

管理函数的第陆个参数param可用来分析由正则情势提供的数量,比方:

1 @app.route(r"^/hello/(?P<who>\w+)?$",['GET'])
2 def hello(req,res,param):
3     res.content('{}={}'.format('who',param['who']))
4     res.status(200)

正则形式 ^/hello/(?P<who>\w+)?$ 是python
re模块能够领悟的方式,当uri为/hello/cnblogs时,其中的参数param就能够是一个包涵以who为键,以cnblogs为其值的dict字典。由此,它能够用来为操作函数提供表单以外的数额,还是能够美化uri。比方/hello?who=cnblogs就不比/hello/cnblogs美观简洁。

别的,同叁个操作函数也得以对应八个路由规则,比方:

1 @app.route(r'^/test/?$',['POST'])
2 @app.route(r"^/$",['GET'])
3 def hello_world(req,res,param):
4     res.header('Content-Type','text/plain;charset=utf-8')
5     res.content('hello,world')
6     res.status(200)

在上边的代码中,操作函数hello_world在uri为/或然/test恐怕/test/时均能被调用,前提是一个供给请求方法是GET,另一个则供给是POST方法。这种三个函数对应八个路由的作用化解了写上面那种代码的难为:

1 if req.method()=='GET':
2     ...
3 if req.method()=='POST':
4     ...

 

hi.py 的提供的路由装饰器接受四个参数,第1个参数钦命动态路由的…

npm install-g express//安装 express

本条路由内定uri为/client只怕/client/,同时请求方法为GET只怕POST的http请求由函数client(req,res,param)来处理。uri形式由正则表明式构成,请求方法参数由二个list表示,可承受的法子名包涵:GET,POST,PUT,HEAD,PATCH等,凡nginx能理解的http方法名均可。

然后

github地址,应接大家付出更新。

管理函数有两个参数,分别是req,res和param。它们各自是hi_req,hi_res和由正则表明式引出的group
dict。前双方是有hi-nginx提供的api,它们提供1体系措施来操控http协议:

npm install-g express-generator//安装 express 命令行工具

express()
express()
用来创制贰个Express的程序。express()
方法是express模块导出的顶层方法。

hi_req

  • uri
  • method
  • client
  • param
  • user_agent
  • has_header
  • get_header
  • has_form
  • get_form
  • has_session
  • get_session
  • has_cookie
  • get_cookie

express -V

var express = require(‘express’);

hi_res

  • status
  • content
  • header
  • session

管理函数的第7个参数param可用来分析由正则情势提供的多寡,举例:

1 @app.route(r"^/hello/(?P<who>\w+)?$",['GET'])
2 def hello(req,res,param):
3     res.content('{}={}'.format('who',param['who']))
4     res.status(200)

正则形式 ^/hello/(?P<who>\w+)?$ 是python
re模块能够精晓的方式,当uri为/hello/cnblogs时,当中的参数param就能够是1个带有以who为键,以cnblogs为其值的dict字典。因而,它能够用来为操作函数提供表单以外的数码,还是能美化uri。举个例子/hello?who=cnblogs就不比/hello/cnblogs雅观简洁。

除此以外,同一个操作函数也足以对应八个路由规则,举例:

1 @app.route(r'^/test/?$',['POST'])
2 @app.route(r"^/$",['GET'])
3 def hello_world(req,res,param):
4     res.header('Content-Type','text/plain;charset=utf-8')
5     res.content('hello,world')
6     res.status(200)

在地点的代码中,操作函数hello_world在uri为/可能/test或许/test/时均能被调用,前提是一个渴求请求方法是GET,另1个则要求是POST方法。那种三个函数对应多少个路由的功力消除了写下边这种代码的劳动:

1 if req.method()=='GET':
2     ...
3 if req.method()=='POST':
4     ...

 

本身未来查阅到的本子是 4.九.0

var app = express();

npm start  代替  node app.js  启动

Methods

http.Server

express.static(root, [options])
express.static
是Express中不今不古的内建中间件。它以server-static模块为根基开拓,担负托管
Express 应用内的静态财富。 参数root
为静态财富的随地的根目录。 参数options
是可选的,匡助以下的品质:
属性
描述
类型
默认值

var http = require(‘http’);

dotfiles
是还是不是响应点文件。供选拔的值有”allow”,”deny”和”ignore”
String
“ignore”

var server = http.createServer(callback); 重临一个http.Server实例

etag
使能或许关闭etag
Boolean
true

属性:

extensions
设置文件延期回退
Boolean
true

server.maxHeadersCount    最大请求头数目限制, 暗许 一千 个. 要是设置为0,
则代表不做别的限制

index
出殡目录索引文件。设置false将不发送。
Mixed
“index.html”

方法:

lastModified
安装文件在系统中的最终修改时间到Last-Modified
尾部。只怕的取值有false
和true

Boolean
true

server.listnen(prot)            监听2个端口

maxAge
在Cache-Control底部中设置max-age
属性,精度为阿秒(ms)或则一段ms
format的字符串
Number
0

server.close(callback)          禁止服务端接收新的连接

redirect
当呼吁的pathname是一个目录的时候,重定向到尾随”/”
Boolean
true

server.setTimeout(msecs_Time, callback) 设置套接字的超时值

setHeaders
当响应静态文件请求时设置headers的章程
Funtion

事件:

假令你想赢得更加多关于采纳中间件的底细,你能够查看Serving static files in
Express。

‘request’ 每收到贰个HTTP请求时接触,
http.createServer的参数暗中认可正是此事件的拍卖程序. 提供3个参数: req, res
分别是http.ServerRequest 和 http.ServerResponse 的实例.
表示请求和响应音讯

Application()
app
指标一般用来代表Express程序。通过调用Express模块导出的顶层的express()
艺术来成立它:

‘connection’ 新的TCP建即刻触发. 提供一个 socket 参数 net.Socket 实例

var express = require(‘express’);

‘close’ 服务器关闭时触发 无参

var app = express();

http.ServerRequest

app.get(‘/’, function(req, res) {

HTTP请求的新闻, 一般由 http.Server的 request 事件发送.

res.send(‘hello world!’);

HTTP 请求分: 请求头.  请求体

});

事件:

app.listen(3000);

‘data’    请求体数据来一时半刻. 参数 chunk 表示收到到的数额

app
对象具有以下的主意:
路由HTTP请求;具体能够看app.METHOD和app.param这多个例子。
计划中间件;具体请看app.route。
渲染HTML视图;具体请看app.render。
注册模板引擎;具体请看app.engine。

’end’     请求体数据传输完结时

它还有局地脾气设置,这一个属性能够改动程序的一举一动。获得越多的新闻,能够查看Application
settings。

’close’ 用户日前恳请甘休时

Properties

属性:

app.locals
app.locals
对象是二个javascript对象,它的属性便是先后本地的变量。

complete      客户端请求是还是不是已经发送实现

app.locals.title

httpVersion  HTTP 协议版本,平时是 1.0 或 1.1

// => ‘My App’

method  HTTP 请求方法,如 GET、POST、PUT、DELETE 等

app.locals.email

url      原始的请求路线,举个例子 /static/image/x.jpg 或 /user?name=byvoid

// =>
‘me@myapp.com’

headers  HTTP 请求头

假诺设定,app.locals
的各属性值将贯穿程序的成套生命周期,与其相反的是res.locals
,它只在这一次请求的生命周期中央银卓有成效。
在程序中,你能够在渲染模板时行使这个地点变量。它们是卓殊实惠的,可认为模板提供部分卓有功能的不二等秘书诀,以及app
级其余数量。通过req.app.locals
(具体查看req.app),Locals能够在中间件中央银行使。

trailers  HTTP 请求尾(不常见)

app.locals.title = ‘My App’;

connection  当前 HTTP 连接套接字,为 net.Socket 的实例

app.locals.strftime = require(‘strftime’);

socket  connection 属性的外号

app.locals.email =
‘me@myapp.com’;

client  client 属性的外号

app.mountpath
app.mountpath
特性是子程序挂载的路子方式。
多少个子程序是三个express
的实例,其能够被用来作为路由句柄来管理请求。

params          多路由决定期的对象

var express = require(‘express’);

http.ServerResponse

var app = express(); // the main app

HTTP响应信息是再次回到给客户端的音信,决定了用户最后见到的结果

var admin = express(); // the sub app

函数

admin.get(‘/’, function(req, res) {

res.writeHead(statusCode, [headers])  该函数在贰次呼吁中最多调用2次.
statusCode, 是HTTP状态码. 如200,404.  headers
类似数组的对象,表示响应头的各样属性

console.log(admin.mountpath); // /admin

res.write(data, [encoding])          发送响应内容,
如若是字符串,要求制定编码情势, 私下认可 utf-八

res.send(‘Admin Homepage’);

res.end(data, data, [encoding])      甘休响应,告知客户端具有响应完毕.
此函数必须调用3次

});

API

app.use(‘/admin’, admin); // mount the sub app

HTTP动词都以Express的方法. post 改、put 增、delete 删、get 查

它和req对象的baseUrl属性相比较相似,除了req.baseUrl
是同盟的ULX570L路线,而不是合营的情势。假使一个子程序被挂载在多条路线格局,app.mountpath
就是三个有关挂载路线方式项的列表,如上边例子所示。

GET

var admin = express();

GET 依照请求路线来管理客户端发出的GET请求

admin.get(‘/’, function(req, res) {

app.get(path, [callback(request, response)])

console.log(admin.mountpath); // [‘adm*n’, ‘/manager’]

ALL

res.send(‘Admin Homepage’);

ALL 以协作全部的HTTP动词,也正是说它能够过滤全体路径的请求

});

app.all(path, [callback(request, response, next)])

var secret = express();

USE

secret.get(‘/’, function(req, res) {

USE express调用中间件的章程,它回到3个函数. path默认为”/”

console.log(secret.mountpath); // /secr*t

app.use([path], [callback(request, response, next)])

res.send(‘Admin secret’);

USE 不只有能够调用中间件,还足以依据请求的网址,再次来到区别的网页内容

});

app.use(function(request,response,next){if(request.url==”/”){response.send(“Welcome
to the
homepage!”);}else{next();}});app.use(function(request,response,next){if(request.url==”/about”){response.send(“Welcome
to the about
page!”);}else{next();}});app.use(function(request,response){response.send(“404
error!”);});

admin.use(‘/secrt’, secret); // load the ‘secret’ router on ‘/secrt’,
on the ‘admin’ sub app

post

app.use([‘/admn’, ‘/manager’], admin); // load the ‘admin’ router on
‘/adm
n’ and ‘/manager’ , on the parent app

拍卖内定页面包车型地铁post请求

Events

app.post(path,function(req, res));

app.on(‘mount’, callback(parent))
当子程序被挂载到父程序时,mount
事件被发射。父程序对象作为参数,传递给回调方法。

想要使用 body 需求安装中间件

var admin = express();

npm install body-parser

admin.on(‘mount’, function(parent) {

npm install multer

console.log(‘Admin Mounted’);

调用

console.log(parent); // refers to the parent app

var bodyParser = require(‘body-parser’);

});

var multer = require(‘multer’);

admin.get(‘/’, function(req, res) {

res.send(‘Admin Homepage’);

app.use(bodyParser.json());

});

app.use(bodyParser.urlencoded({ extended: true }));

app.use(‘/admin’, admin);

app.use(multer());

Methods

req.body 解析客户端的post请求参数

app.all(path, callback[, callback …]
app.all
措施和专门的工作的app.METHOD()
主意一般,除了它卓殊全体的HTTP动词。
对于给3个特种前缀映射二个大局的逻辑管理,可能无条件相称,它是很有效的。比方,要是你把下边内容放在全数别的的路由定义的前头,它要求全数从那些点伊始的路由须要表明和机关加载二个用户。记住那些回调并不是一定是终点:loadUser
能够在成就了一个职务后,调用next()
艺术来继续同盟随后的路由。

格式:req.body.参数名;

app.all(‘*’, requireAuthentication, loadUser);

瞩目: 表单所发送的 post请求 Accept 和 ajax 的不平等

只怕那种相等的样式:

服务器 send 发回来的数目,ajax是多少, 表单会反映称网页

app.all(‘*’, requireAuthentication);

param/query/params

app.all(‘*’, loadUser);

赢得主机名、路线名.[此地的req便是回调函数中的第二个参数]

另二个例证是大局的白名单方法。这一个例子和后边的很像,然则它只是限制以/api
早先的门路。

req.host 再次来到请求头里取的主机名(不带有端口号);

app.all(‘/api/*’, requireAuthentication);

req.path 重返请求的UPAJEROL的路线名

app.delete(path, callback[, callback …])
路由HTTP DELETE
恳请到有特殊回调方法的超过常规规的路子。获取更加多的消息,能够查看routing
guide。
你能够提供多少个回调函数,它们的作为和中间件同样,除了那些回调可以通过调用next(‘router’)
来绕过剩余的路由回调。你能够使用那些机制来为一个路由设置有个别前提条件,假若无法满意当下路由的拍卖原则,那么您能够传递控制到跟着的路由。

req.query 是二个对象,存款和储蓄着get请求路线参数的指标属性

app.delete(‘/’, function(req, res) {

www.***.com/shoes?order=desc&shoe[color]=blue&shoe[type]=converse 
网址

res.send(‘DELETE request to homepage’);

得到: { order: ‘desc’, shoe: { color: ‘blue’, type: ‘converse’ } }

});

req.param() 功效同上,不过是函数情势 req.param(‘order’) 重回 desc

app.disable(name)
设置类型为布尔的装置名称为name
的值为false
,此处的name
是app settings
table中各属性的三个。调用app.set(‘foo’,
false)
和调用app.disable(‘foo’)
是等价的。 举个例子:

// req.param(‘name’)
还能收获具备相应路由规则的请求对象app.get(“/user/:name/”,function(req,res){console.log(req.param(“name”));res.send(“使用req.param属性获取具备路由规则的参数对象值!”);});

app.disable(‘trust proxy’);

// req.params
同上,但能够相称复杂命名路由规则的请求app.get(“/user/:name/:id”,function(req,res){console.log(req.params.id);});

app.get(‘trust proxy’);

send

// => false

send 方法向浏览器发送两个响应信息,并能够智能管理差异品种的数据
send方法在出口响应时会自动实行局地装置,比如HEAD消息、HTTP缓存协理等等
类型能够是: String, Array, Object, Number.
当参数为多个String时,Content-Type私下认可设置为”text/html”
当参数为Array或Object时,Express会再次来到3个JSON
当参数为1个NumberExpress会帮你设置七个响应体,比方:200

app.disabled(name)
返回true
尽管布尔类型的安装值name
被剥夺为false
,此处的name
是app settings
table中各属性的八个。

set

app.disabled(‘trust proxy’);

app.set(‘view engine’, ‘ejs’);  设置私下认可模板引擎

// => true

app.engine( ‘.html’, require( ‘ejs’ ).__express ); 修改模板引擎

app.enable(‘trust proxy’);

“__express”,ejs模块的多个集体属性,表示要渲染的文件扩展名

app.disabled(‘trust proxy’);

app.set(‘views’, __dirname);  设定views变量,意为视图存放的目录

// => false

express.static —— 钦定静态文件的物色目录

app.enable(name)
设置布尔类型的装置值name
为true
,此处的name
是app settings
table中各属性的一个。调用app.set(‘foo’,
true)
和调用app.enable(‘foo’)
是等价的。

app.use(express.static(require(‘path’).join(__dirname, ‘public’)));

app.enable(‘trust proxy’);

模板操作:

app.get(‘trust proxy’);

app.set(‘views’, path.join(__dirname, ‘views’));

// => true

app.set(‘view engine’, ‘html’);

app.enabled(name)
返回true
如若布尔类型的安装值name
被运行为true
,此处的name
是app settings
table中各属性的1个。

app.engine(’.html’, require(‘ejs’).__express);

app.enabled(‘trust proxy’);

如此模板后缀能够使 .html  但模板代码是ejs代码

// => false

render

app.enable(‘trust proxy’);

何对网页模板举行访问. res对象的render函数

app.enabled(‘trust proxy’);

res.render(view, [locals], callback);

// => true

view 视图名, locals 为模板传入变量

app.engine(ext, callback)
注册给定引擎的回调,用来渲染管理ext文件。
私下认可景况下,Express要求选取require()
来加载基于文件扩大的斯特林发动机。举例,要是你品尝渲染多个foo.jade
文本,Express在内部调用下边的内容,同时缓存require()
结果供随后的调用,来加速品质。

redirect

app.engine(‘jade’, require(‘jade’).__express);

同意网站的重定向,跳转到钦命的url并且能够内定status,默感到30二办法

应用上边包车型大巴不二等秘书技对于那二个尚未提供开箱即用的.__express
方法的模板,恐怕您期望接纳分歧的模版引擎扩张。
比如,使用EJS模板引擎来渲染.html
文件:

依据钦赐url来重定向,能够域内路线、网页间跳转也能够跳转至不一致域名

app.engine(‘html’, require(‘ejs’).renderFile);

res.redirect([status], url);

在这一个例子中,EJS提供了1个.renderFile
情势,那一个方法满意了Express规定的具名规则:(path, options, callback)
,但是记住在内部它只是ejs.__express
的三个别称,所以你可以在不做其余事的情事下直接使用.ejs
恢宏。
一些模板引擎未有服从那种专门的学业,consolidate.js库映射模板引擎以上边包车型大巴运用办法,所以她们得以无缝的和Express专门的学问。

res.redirect(“login”);

var engines = require(‘consolidate’);

Middleware<中间件>

app.engine(‘haml’, engines.haml);

中间件(middleware)就是拍卖HTTP请求的函数,用来成功各样特定的职务,例如检查用户是或不是登陆、分析数据、以及另外在急需最终将数据发送给用户此前产生的职务。
它最大的性状正是,一在那之中间件管理完,可以把相应数据再传递给下二在那之中间件。

app.engine(‘html’, engines.hogan);

//延续调用二在那之中等件app.use(function(request,response,next){console.log(“method:”+request.method+”

“+”url:”+request.url);next();});app.use(function(request,response){response.writeHead(200,{“Content-Type”:”text/html;charset=utf-捌”});response.end(‘示例:一而再调用两个中等件’);});

鉴于那种原因,所以调用中间件的顺序十三分重大

设定静态文件目录的拜访路线

express.static(path.join(__dirname, ‘/public’))

express-session

varsession=require(‘express-session’);app.use(session({secret:’secret’,resave:true,saveUninitialized:false,cookie:{maxAge:1000*60*十//过期时间设置(单位纳秒)}}));//新添中间件并设置模板变量值app.use(function(req,res,next){res.locals.user=req.session.user;varerr=req.session.error;res.locals.message=”;if(err)res.locals.message=’

‘+err+’

‘;next();});

body-parser

npm install body-parser

npm install
multer调用varbodyParser=require(‘body-parser’);varmulter=require(‘multer’);……app.use(bodyParser.json());app.use(bodyParser.urlencoded({extended:true}));app.use(multer());

app.get(name)
收获设置名字为name
的app设置的值,此处的name
是app settings
table中各属性的八个。
如下:

app.get(‘title’);

// => undefined

app.set(‘title’, ‘My Site’);

app.get(‘title’);

// => ‘My Site’

app.get(path, callback [, callback …])
路由HTTP GET
伸手到有至极回调的超过常规规路径。获取更多的音讯,能够查看routing
guide。
你能够提供多少个回调函数,它们的一颦一笑和中间件同样,除了那些回调能够经过调用next(‘router’)
来绕过剩余的路由回调。你能够动用这几个机制来为3个路由设置有些前提条件,假诺请求没能满意当下路由的拍卖标准,那么传递调节到跟着的路由。

app.get(‘/’, function(req, res) {

res.send(‘GET request to homepage’);

});

app.listen(port, [hostname], [backlog], [callback])
绑定程序监听端口到钦赐的主机和端口号。那一个主意和Node
中的http.Server.listen()是同等的。

var express = require(‘express’);

var app = express();

app.listen(3000);

通过调用express()
回到获得的app
实际是1个JavaScript的Function
,被规划用来作为1个回调传递给Node HTTP servers
来拍卖请求。这样,其就足以很便捷的基于同样份代码提供http和https版本,所以app未有从那个后续(它只是二个大约的回调)。

var express = require(‘express’);

var https = require(‘https’);

var http = require(‘http’);

http.createServer(app).listen(80);

https.createServer(options, app).listen(443);

app.listen()
主意是上面所示的三个福利的办法(只针对HTTP协议):

app.listen = function() {

var server = http.createServer(this);

return server.listen.apply(server, arguments);

};

app.METHOD(path, callback [, callback …])
路由1个HTTP请求,METHOD
是以此请求的HTTP方法,举例GET
,PUT
,POST
等等,注意是小写的。所以,实际的方法是app.get()
,app.post()
,app.put()
等等。上面有关于方法的完好的表。 获取越来越多消息,请看routing
guide。
Express支持上边包车型大巴路由方法,对应与同名的HTTP方法:
checkout
connect
copy
delete
get
head
lock
merge
mkactivity

mkcol
move
m-search
notify
options
patch
post
propfind
proppatch

purege
put
report
search
subscribe
trace
unlock
unsubscribe

壹旦采纳上述格局时,导致了不算的javascript的变量名,可以使用中括号符号,例如,app[‘m-search’](‘/’,
function …

您能够提供多少个回调函数,它们的一言一行和中间件一样,除了这几个回调能够经过调用next(‘router’)
来绕过剩余的路由回调。你能够应用那一个机制来为七个路由设置有些前提条件,要是请求未有满意当下路由的处理规范,那么传递控制到跟着的路由。
本API文书档案把施用比较多的HTTP方法app.get()
,app.post
,app.put()
,app.delete()
作为一个个独自的项进行认证。然而,其余上述列出的情势以完全同样的格局专门的工作。

app.all()
是多个独特的路由方法,它不属于HTTP协议中的规定的主意。它为2个路径加载中间件,其对具备的呼吁方法都灵验。

app.all(‘/secret’, function (req, res) {

console.log(‘Accessing the secret section…’);

next(); // pass control to the next handler

});

app.param([name], callback)
给路由参数增多回调触发器,这里的name
是参数名也许参数数组,function
是回调方法。回调方法的参数按序是伸手对象,响应对象,下当中间件,参数值和参数名。
即便name
是数组,会遵照顺序参数在数组中被声称的次第将回调触发器注册下来。还有,对于除了最后2个参数的其余参数,在她们的回调中调用next()
来调用下个表明参数的回调。对于最终二个参数,在回调中调用next()
将调用位于当前拍卖路由中的下二在那之中间件,如若name
只是一个string
那就和它是平等的(正是说惟有2个参数,那么便是终极1个参数,和数组中最后2个参数是千篇一律的)。
举个例子,当:user
并发在路由路线中,你能够映射用户加载的逻辑管理来机关提供req.user
给那么些路由,或许对输入的参数举行表明。

app.param(‘user’, function(req, res, next, id) {

User.find(id, function(error, user) {

if (err) {

next(err);

}

else if (user){

req.user = user;

} else {

next(new Error(‘failed to load user’));

}

});

});

对于Param
的回调定义的路由来讲,他们是局地的。它们不会被挂载的app也许路由传承。所以,定义在app
上的Param
回调唯有是在app
上的路由具备那些路由参数时才起效果。 在概念param
的路由上,param
回调都是第二个被调用的,它们在2个请求-响应循环中都会被调用3遍并且唯有2遍,即便八个路由都格外,如上边的例证:

app.param(‘id’, function(req, res, next, id) {

console.log(‘CALLED ONLY ONCE’);

next();

});

app.get(‘/user/:id’, function(req, res, next) {

console.log(‘although this matches’);

next();

});

app.get(‘/user/:id’, function(req, res) {

console.log(‘and this mathces too’);

res.end();

});

当GET /user/42
,获得上面包车型大巴结果:

CALLED ONLY ONCE

although this matches

and this matches too

app.param([‘id’, ‘page’], function(req, res, next, value) {

console.log(‘CALLED ONLY ONCE with’, value);

next();

});

app.get(‘/user/:id/:page’, function(req. res, next) {

console.log(‘although this matches’);

next();

});

app.get(‘/user/:id/:page’, function (req, res, next) {

console.log(‘and this matches too’);

res.end();

});

当执行GET /user/42/3
,结果如下:

CALLED ONLY ONCE with 42

CALLED ONLY ONCE with 3

although this matches

and this mathes too

上边章节描述的app.param(callback)
在v4.1一.0后头被弃用。

透过只传递二个回调参数给app.param(name, callback)
方法,app.param(naem, callback)
办法的作为将被全然改造。那些回调参数是关于app.param(name, callback)
该具备如何的行事的3个自定义方法,这几个法子必须承受七个参数并且重返多在那之中间件。
这几个回调的率先个参数正是内需捕获的url的参数名,第二个参数能够是任一的JavaScript对象,其恐怕在贯彻重临二当中间件时被应用。
那一个回调方法重临的中间件决定了当UOdysseyL中富含那一个参数时所运用的表现。
在底下的例子中,app.param(name, callback)
参数签字被涂改成了app.param(name, accessId)
。替换接受一个参数名和回调,app.param()
近来领受二个参数名和1个数字。

var express = require(‘express’);

var app = express();

app.param(function(param, option){

return function(req, res, next, val) {

if (val == option) {

next();

}

else {

res.sendStatus(403);

}

}

});

app.param(‘id’, 1337);

app.get(‘/user/:id’, function(req, res) {

res.send(‘Ok’);

});

app.listen(3000, function() {

console.log(‘Ready’);

});

在那些事例中,app.param(name, callback)
参数具名保持和原先一样,不过替换来了八当中间件,定义了2个自定义的数据类型检查评定方法来检查测试user
id
的项目精确性。

app.param(function(param, validator) {

return function(req, res, next, val) {

if (validator(val)) {

next();

}

else {

res.sendStatus(403);

}

}

});

app.param(‘id’, function(candidate) {

return !isNaN(parseFloat(candidate)) && isFinite(candidate);

});

在行使正则表明式来,不要使用.
。举例,你无法采纳/user-.+/
来捕获user-gami
,用使用[\s\S]
或者[\w\>W]
来代替(正如/user-[\s\S]+/
)。
//captures ‘1-a_6’ but not ‘543-azser-sder’

router.get(‘/[0-9]+-[[\w]]*’, function);

//captures ‘1-a_6’ and ‘543-az(ser”-sder’ but not ‘5-a s’

router.get(‘/[0-9]+-[[\S]]*’, function);

//captures all (equivalent to ‘.*’)

router.get(‘[[\s\S]]*’, function);

app.path()
透过这几个点子能够博得app
超级的路径,其是四个string

var app = express()

, blog = express()

, blogAdmin = express();

发表评论

电子邮件地址不会被公开。 必填项已用*标注