当前位置: 首页 > 后端技术 > Node.js

Node.js学习之路24-Express框架的app对象

时间:2023-04-03 23:36:09 Node.js

1.express()基于Node.js平台,一个快速、开放、极简的web开发框架。创建一个Express应用程序。express()是express模块导出的入口顶层函数。constexpress=require('express');letapp=express();1.1静态资源管理express.static(root,[options])express.static是Express中唯一内置的中间件。它基于serve-static开发,负责托管Express应用中的静态资源。root,参数为静态资源文件所在的根目录。options,对象为Optional,支持以下属性dotfiles,String类型,服务dotfiles的选项。可能的值有allow、deny、ignore,默认值为ignoremaxAge,设置Cache-Control头的最大属性,单位为毫秒或ms格式字符串中的字符,默认为0etag,布尔型,启用或禁用etag生成扩展,mixed,设置文件扩展名索引,布尔类型,发送目录索引,设置false禁用重定向,布尔类型,当路径为目录时,重定向到尾随/,etHeaders,函数类型,设置文件使用HTTP头的函数服务器向服务器请求资源A时,服务器根据A计算出一个哈希值(3f80f-1b6-3e1cb03b),通过ETag返回给浏览器,浏览器将3f80f-1b6-3e1cb03b和A缓存在本地同时。再次向服务端请求A时,会通过类似If-None-Match:"3f80f-1b6-3e1cb03b"的请求头向服务端发送ETag,服务端会再次计算A的哈希值并进行比较使用浏览器返回的值。如果发现A发生了变化,则返回A给浏览器200,如果发现A没有发生变化,则返回一个未修改的304给浏览器。这样通过在浏览器端控制缓存,可以节省服务器的带宽,因为服务器不需要每次都将全量的数据返回给客户端。注意:HTTP没有规定如何生成ETag,hash是一个理想的选择。1.3.创建一个基本的HTTP服务器constexpress=require('express');letapp=express();app.get('/',(req,res)=>{res.send('helloworld');});app.listen(3000);1.4。app对象的locals属性可以在locals对象上自定义app.locals.title='myexpresstitle';app.locals.email='express@express.com';{settings:{'x-powered-by':true,etag:'weak','etagfn':[Function:wetag],env:'development','queryparser':'extended','queryparserfn':[Function:parseExtendedQueryString],'subdomainoffset':2,'trustproxy':false,'trustproxyfn':[Function:trustNone],view:[Function:View],views:'E:\\Self\\point\\views','jsonpcallbackname':'callback'},title:'myexpresstitle',email:'express@express.com'}1.5.app.all(path,callback(req,res,next){...})app.all('*',fn1,fn2...)//等同于app.all('*',fn1)app.all('*',fn2)1.6。删除请求路由app.delete(path,callback[,callback...])将HTTP删除请求路由到指定的路径,并带有指定的回调函数app.delete('/',function(req,res){res.send('删除主页请求');});1.7.禁用和启用一个属性disableapp.disable(name),app.disabled(name)(app.get('用户名'));//expressserverapp.set('username','expressserver');app.disable('username');console.log(app.get('username'));//假1.8。模板引擎app.engine(ext,callback)根据不同模板引擎的扩展,使用不同的模板app.engine('jade',require('jade').__express);app.engine('html',require('ejs').renderFile);1.9.设置和获取属性app.set('title','text');console.log(app.get('title'));//text1.10.get请求app.get(path,callback[,callback...])将HTTPget请求路由到指定的路径,并带有指定的回调函数app.get('/',function(req,res){res.send('获取主页请求');});1.11.监听端口app.listen(port,[hostname],[backlog],[callback(err)])监听端口,主机,最大连接数,回调函数constexpress=require('express');letapp=express();app.get('/',function(req,res){res.send('homepage');});app.listen(3000,'localhost',100,function(err){if(err){console.log('error');}else{console.log('http服务器运行在localhost:3333');}});1.12。路由参数app.param([name],callback(req,res,next,id){...})给路由参数添加一个回调触发器,其中name是参数的名称或者它们的数组,function是回调函数。回调函数的参数是请求对象、响应对象、下一个中间件和该参数的值(按顺序)。如果name是一个数组,则按照声明的顺序为其中声明的每个参数注册回调触发器。此外,对于每个声明的参数,除了最后一个参数,回调中的下一个调用将为下一个声明的参数调用回调。对于最后一个参数,调用next会为当前正在处理的路由调用下一个中间件,就好像名字只是一个字符串一样。参数是一个字符串app.param('id',(req,res,next,id)=>{console.log('只调用一次');next();});app.get('/user/:id',(req,res,next)=>{console.log('虽然匹配');next();});app.get('/user/:id',(req,res)=>{console.log('thismatchestoo');res.send('enduserid');});/**calledonceoncealthoughthismatchesthistoomatches*/参数为数组app.param(['id','page'],(req,res,next,id)=>{console.log('只调用一次',id);next();});app.get('/user/:id/:page',(req,res,next)=>{console.log('虽然这匹配');next();});app.get('/user/:id/:page',(req,res)=>{console.log('thismatchestoo');res.send('enduserid');});/**calledonlyoncekkkcalledonlyonce555althoughthismatchesthismatchestoo*/1.13.app.path()返回应用程序的规范化路径letexpress=require('express');letapp=express();letblog=express();letblogAdmin=express();app.use('/blog',博客);blog.use('/admin',blogAdmin);控制台日志(应用程序路径());console.log(blog.path());console.log(blogAdmin.path());1.14.模板渲染app.render(view,[locals],callback(err,html){...})回调函数返回渲染后的视图的HTML1.15。路由设置app.route(path)返回单个路由实例app.route('/one').all(function(req,res,next){console.log('routeall');next();}).get(function(req,res,next){res.json({code:2589,msg:'routegetmsg'});}).post(function(req,res,next){res.send('这是路由后发送消息');});1.16。中间件app.use([路径,]callback(req,res,next){...})在路径处加载一个中间件函数。如果不指定path,默认为/path可以是表示路径的数组,路径模式,匹配路径的正则表达式,或者它们的组合stringapp.use()中间件可以使用正则匹配路径,其中多个可以使用中间件函数app.use(express.static(__dirname+'/public'));app.use('/static',express.static(__dirname+'/public'));app.use(express.static(__dirname+'/public'));app.use(logger());app.use(express.static(__dirname+'/public'));app.use(express.static(__dirname+'/files'));app.use(express.static(__dirname+'/uploads'));中间件示例app.use('/user/person',(req,res,next)=>{console.log(req.originalUrl);///user/personconsole.log(req.baseUrl);///用户/个人console.log(req.path);///next();});如果使用app.use(callback()),app.get('/',callback())//这个中间件不会被触发允许请求超出它app.use((req,res,next)=>{res.send('HelloWorld');})//请求永远不会到达这个路由app.get('/',(req,res)=>{res.send('Welcome');})