express中文api

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

express()创建一个express应用程序varexpress=require('express');varapp=express();app.get('/',function(req,res){res.send('helloworld');});app.listen(3000);Applicationapp.set(name,value)将设置项name的值设为valueapp.set('title','MySite');app.get('title');//=MySiteapp.get(name)获取设置项name的值app.get('title');//=undefinedapp.set('title','MySite');app.get('title');//=MySiteapp.enable(name)将设置项name的值设为true.app.enable('trustproxy');app.get('trustproxy');//=trueapp.disable(name)将设置项name的值设为false.app.disable('trustproxy');app.get('trustproxy');//=falseapp.enabled(name)检查设置项name是否已启用app.enabled('trustproxy');//=falseapp.enable('trustproxy');app.enabled('trustproxy');//=trueapp.disabled(name)检查设置项name是否已禁用app.disabled('trustproxy');//=trueapp.enable('trustproxy');app.disabled('trustproxy');//=falseapp.configure([env],callback)当env和app.get('env')(也就是process.env.NODE_ENV)匹配时,调用callback。保留这个方法是出于历史原因,后面列出的if语句的代码其实更加高效、直接。使用app.set()配合其它一些配置方法后,没有必要再使用这个方法。//所有环境app.configure(function(){app.set('title','MyApplication');})//开发环境app.configure('development',function(){app.set('dburi','localhost/dev');})//只用于生产环境app.configure('production',function(){app.set('dburi','n.n.n.n/prod');})更高效且直接的代码如下://所有环境app.set('title','MyApplication');//只用于开发环境if('development'==app.get('env')){app.set('dburi','localhost/dev');}//只用于生产环境if('production'==app.get('env')){app.set('dburi','n.n.n.n/prod');}app.use([path],function)使用中间件function,可选参数path默认为/。varexpress=require('express');varapp=express();//一个简单的loggerapp.use(function(req,res,next){console.log('%s%s',req.method,req.url);next();});//响应app.use(function(req,res,next){res.send('HelloWorld');});app.listen(3000);挂载的路径不会在req里出现,对中间件function不可见,这意味着你在function的回调参数req里找不到path。这么设计的为了让间件可以在不需要更改代码就在任意前缀路径下执行这里有一个实际应用场景,常见的一个应用是使用./public提供静态文件服务,用express.static()中间件://GET/javascripts/jquery.js//GET/style.css//GET/favicon.icoapp.use(express.static(__dirname+'/public'));如果你想把所有的静态文件路径都前缀/static,你可以使用“挂载”功能。如果req.url不包含这个前缀,挂载过的中间件不会执行。当function被执行的时候,这个参数不会被传递。这个只会影响这个函数,后面的中间件里得到的req.url里将会包含/static//GET/static/javascripts/jquery.js//GET/static/style.css//GET/static/favicon.icoapp.use('/static',express.static(__dirname+'/public'));使用app.use()“定义的”中间件的顺序非常重要,它们将会顺序执行,use的先后顺序决定了中间件的优先级。比如说通常express.logger()是最先使用的一个组件,纪录每一个请求app.use(express.logger());app.use(express.static(__dirname+'/public'));app.use(function(req,res){res.send('Hello');});如果你想忽略请求静态文件的纪录,但是对于在logger()之后定义的路由和中间件想继续纪录,只需要简单的把static()移到前面就行了:app.use(express.static(__dirname+'/public'));app.use(express.logger());app.use(function(req,res){res.send('Hello');});另一个现实的例子,有可能从多个目录提供静态文件服务,下面的例子中会优先从./public目录取文件app.use(express.static(__dirname+'/public'));app.use(express.static(__dirname+'/files'));app.use(express.static(__dirname+'/uploads'));settings下面的内建的可以改变Express行为的设置env运行时环境,默认为process.env.NODE_ENV或者developmenttrustproxy激活反向代理,默认未激活状态jsonpcallbackname修改默认?callback=的jsonp回调的名字jsonreplacerJSONreplacer替换时的回调,默认为nulljsonspacesJSON响应的空格数量,开发环境下是2,生产环境是0casesensitiverouting路由的大小写敏感,默认是关闭状态,/Foo和/foo是一样的strictrouting路由的严格格式,默认情况下/foo和/foo/是被同样对待的viewcache模板缓存,在生产环境中是默认开启的viewengine模板引擎views模板的目录,默认是process.cwd()+./viewsapp.engine(ext,callback)注册模板引擎的callback用来处理ext扩展名的文件默认情况下,根据文件扩展名require()对应的模板引擎。比如你想渲染一个foo.jade文件,Express会在内部执行下面的代码,然后会缓存require(),这样就可以提高后面操作的性能app.engine('jade',require('jade').__express);那些没有提供.__express的或者你想渲染一个文件的扩展名与模板引擎默认的不一致的时候,也可以用这个方法。比如你想用EJS模板引擎来处理.html后缀的文件:app.engine('html',require('ejs').renderFile);这个例子中EJS提供了一个.renderFile()方法和Express预期的格式:(path,options,callback)一致,可以在内部给这个方法取一个别名ejs.__express,这样你就可以使用.ejs扩展而不需要做任何改动有些模板引擎没有遵循这种转换,这里有一个小项目consolidate.js专门把所有的node流行的模板引擎进行了包装,这样它们在Express内部看起来就一样了。varengines=require('consolidate');app.engine('haml',engines.haml);app.engine('html',engines.hogan);app.param([name],callback)路由参数的处理逻辑。比如当:user出现在一个路由路径中,你也许会自动载入加载用户的逻辑,并把它放置到req.user,或者校验一下输入的参数是否正确。下面的代码片段展示了callback很像中间件,但是在参数里多加了一个值,这里名为id.它会尝试加载用户信息,然后赋值给req.user,否则就传递错误next(err).app.param('user',function(req,res,next,id){User.find(id,function(err,user){if(err){next(err);}elseif(user){req.user=user;next();}else{next(newError('failedtoloaduser'));}});});另外你也可以只传一个callback,这样你就有机会改变app.param()API.比如express-params定义了下面的回调,这个允许你使用一个给定的正则去限制参数。下面的这个例子有一点点高级,检查如果第二个参数是一个正则,返回一个很像上面的user参数例子行为的回调函数。app.param(function(name,fn){if(fninstanceofRegExp){returnfunction(req,res,next,val){varcaptures;if(captures=fn.exec(String(val))){req.params[name]=captures;next();}else{next('route');}}}});这个函数现在可以非常有效的用来校验参数,或者提供正则捕获后的分组。app.param('id',/^\d+$/);app.get('/user/:id',function(req,res){res.send('user'+req.params.id);});app.param('range',/^(\w+)\.\.(\w+)?$/);app.get('/range/:range',function(req,res){varrange=req.params.range;res.send('from'+range[1]+'to'+range[2]);});app.VERB(path,[callback...],callback)app.VERB()方法为Express提供路由方法,VERB是指某一个HTTP动作,比如app.post()。可以提供多个callbacks,这多个callbacks都将会被平等对待,它们的行为跟中间件一样,也有一个例外的情况,如果某一个callback执行了next('route'),它后面的callback就被忽略。这种情形会应用在当满足一个路由前缀,但是不需要处理这个路由,于是把它向后传递。下面的代码片段展示最简单的路由定义。Express

1 / 51
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功