• 1.Express入门


    Express提供了轻量级框架,把Node.js的http模块功能封装在接口中。

    也扩展了http模块功能,处理服务器路由,响应,cookie和HTTP请求的状态。

    实现Express充当服务器,设计路由,用Request和Response对象发送和接受HTTP请求

    1.Express入门

    npm install express@4.0.0 

    安装到package.json模块

    var express=require('express');
    var app=express();
    

    1.1.配置Express设置

    提供了控制Express服务器的行为的应用程序设置。定义了环境以及Express如何处理JSON解析,路由和视图。

    set(setting,value)

    enable(setting)

    disable(setting)

    1.2.启动Express服务器

    var express=require('express');
    var app=express();
    app.listen(8080);
    

    express()返回的是回调函数,映射http.createServer() http.createServer()

    var express=require('express');
    var https=require('https');
    var http=require('http');
    var fs=require('fs');
    var app=express();
    var options={
    	host:'127.0.0.1',
    	key:fs.readFileSync('ssl/server.key'),
    	cert:fs.readFileSync('ssl/server.crt'),
    };
    http.createServer(app).listen(80);
    https.createServer(options,app).listen(443);
    app.get('',function(req,res){
    	res.send('hello from express!')
    })
    

    2.配置路由  

    服务器开始前,要定义路由。route是:如何处理针对Express服务器的HTTP请求的URI路径部分。

    2.1.实现路由

    第一部分:HTTP请求方法(GET POST)

    第二部分:URL中指定的路径。 /根目录  /login登录页面  /cart显示购物车  

    app.method(path,[middleware,...],callback)

    path:通过回调函数来处理的URL路径部分。

    middleware:回调函数执行前要应用的中间件函数。

    callback:处理该请求并把响应发回客户端的请求处理程序。 

    基本的GET POST路由

    app.get('/',function(req,res){
       res.send("server root"); 
    });
    app.get('/login',function(req,res){
       res.send("login page"); 
    });
    app.post('/save',function(req,res){
       res.send("save page"); 
    })
    

    在路由中应用参数:(为不同的请求提供唯一值 来定义应用程序如何处理请求并生成响应 为类似的请求使用相同的路由)

    查询字符串:在URL路径后面使用标准的 ?key=value&key=value...  (但会冗长)

    POST参数:实现Web表单或另一个POST请求时,正文中传递参数

    正则:定义正则表达式作为路由的路径部分。解析URL并把与表达式匹配的路径作为参数数组传递

    定义的参数:路由的路径部分 <parm_name>定义参数

    1)查询字符串应用路由参数

    var express=require("express");
    var url=require("url");
    var app=express();
    app.get("/find",function(req,res){
    	var url_parts=url.parse(req.url,true);
    	var query=url_parts.query;
    	res.send('Find book:author: '+query.author+' Title: '+query.title);
    });
    //find?author=brad&title=Node
    //Find book:author: brad Title: Node
    

    2)使用正则表达式作为路由参数

    app.get(/^/boox/(w+):(w+)?$/,function(req,res){
       res.send('Get Book: Chapter: '+req.params[0]+' Page: '+req.params[1]);
    })
    
    //   /book/12:5
    //   Get Book:Chapter: 12 Page: 15
    

    3)使用已定义的参数

    如果有更结构化的数据,在路由的路径中按名称定义参数 <param_name>

    app.get('/user/:userid',function(req,res){
       res.send("get user: "+req.param("userid"));
    });
    //  /user/4567
    //  Get User:4567
    
    app.param('userid',function(req,res,next,value){
       console.log("request with userid: "+value);
    })
    //  /user/4567
    //  request with userid:4567
    

    定义的参数在url中:可指定被执行的回调函数。解析URL时,express发现某个参数有注册的回调函数时,就在

    调用 路由处理程序之前 调用参数的回调函数

    app.param(param,function(req,res,next,value){});

    value:解析的参数的值

    3.使用Request对象

    将一个Request对象作为第一个参数传递到路由处理程序。

    Request对象提供请求的数据和元数据,包括URL,标头,查询字符。

    var express=require("express");
    var app=express();
    app.listen(8081);
    app.get("/user/:userid",function(req,res){
    	console.log("URL:	 "+req.originalUrl);
    	console.log("Protocol:	 "+req.protocol);
    	console.log("IP:	 "+req.ip);
    	console.log("Path:	 "+req.path);
    	console.log("Host:	 "+req.host);
    	console.log("Method:	 "+req.method);
    	console.log("Query:	 "+JSON.stringify(req.query));
    	console.log("Fresh:	 "+req.fresh);
    	console.log("Stale:	 "+req.stale);
    	console.log("Secure:	 "+req.secure);
    	console.log("utf8:	 "+req.acceptsCharset('utf8'));
    	console.log("Connetion:	 "+req.get('connetion'));
    	console.log("Headers:	 "+JSON.stringify(req.headers,null,2));
    	res.send("user request");
    })

    4.使用Response对象

    提供了必要的功能建立和发送适当的HTTP响应。Response对象设置标头,设置状态,将数据发送回客户端。

    1)设置标头 HTTP响应。

    var oldType=res.get('Content-Type');
    res.set('Content-Type','text/plain');  

    2)设置状态

    HTTP状态时200以外的值,就需要设置。

    res.status(200); //OK正确
    res.status(300); //Redirection重定向
    res.status(400); //Bad Request错误的请求
    res.status(401); //Unauthorized未经许可
    res.status(403); //Forbidden禁止
    res.status(500); //Server Error服务器错误
    

    3)发送响应

    res.send(status,[body]);//status是状态码 body是String或Buffer对象

    res.set('Content-Type','text/html');
    res.send(new Buffer('<html><body>HTML String</body></html>'));
    

    使用Response对象发送状态,标头,响应数据

    //使用Response对象发送状态,标头和响应数据
    var express=require("express");
    var url=require("url");
    var app=express();
    app.listen(8081);
    app.get('',function(req,res){
    	var response='<html><head><title>Simple Send</title></head>'+
    	'<body><h1>Hello From Express</h1></body></html>';
    	res.status(200);
    	res.set({
    		'Content-Type':'text/html',
    		'Content-Length':response.length
    	});
    	res.send(response);
    	console.log('Response Finished? '+res.finished);
    	console.log('
    Headers Sent');
    	console.log(res);
    	console.log(res.headerSent);	
    });
    app.get('/error',function(req,res){
    	res.status(400);
    	res.send("This is a bad request");
    });
    

    4)发送JSON响应

    使用JSON数据从服务器传输信息到客户端,让客户端动态填充页面上的HTML元素。

    Express 在 Response对象上提供了json() jsonp()方法

    res.json(status,[object])
    res.json([body]);
    res.jsonp(status,[object])
    res.jsonp([body]);
    
    var express=require('express');
    var url=require('url');
    var app=express();
    app.listen(8081);
    app.get('/json',function(req,res){
    	app.set('json spaces',4);
    	res.json({name:"smithson",built:'1846',items:'147M',
    		centers:['art','astrophsics','natural history']
    });
    });
    app.get('/error',function(req,res){
    	app.set('jsonp callback name','cb');
    	res.json({name:"smithson",built:'1846',items:'147M',
    		centers:['art','astrophsics','natural history']
    });
    })
    

    5)发送文件

    Express:Response对象上的sendfile(filepath)方法。

    sendfile使用一个函数调用完成将文件发送到客户端要做的全部事情。

    基于文件扩展名设置Content-Type标头的类型

    设置其他相应的标头,如Content-Length(内容长度)

    设置响应的状态。

    使用response对象内部的链接。把文件内容发送给客户端

    res.sendfile(path,[options],[callback])

    path指定要发给客户端的文件。

    options参数是一个对象,包含maxAge属性定义最长期限的内容和root属性。文件传输完成时,回调函数被调用

    var express=require("express");
    var url=require("url");
    var app=express();
    app.listen(8081);
    app.get("/image",function(req,res){
    	res.sendfile('1.jpg',{maxAge:1,//24*60*60*1000,
    		root:'./views/'},
    		function(err){
    			if(err){
    				console.log('error');
    			}else{
    				console.log("success");
    			}
    		});
    })
    

    6)发送下载响应

    res.download(path,[filename],[callback])
    

    7)重定向响应

    res.redirect(path) 处理重定向到一个新位置的请求(实现web服务器时,可能需要把来自客户端的请求重定向到同一台服务器上的不同位置,或完全不同服务器上)

    var express=require("express");
    var url=require("url");
    var app=express();
    app.listen(8081);
    app.get('/google',function(req,res){
    	res.redirect('http://google.com');
    });
    app.get('/first',function(req,res){
    	res.redirect('/second');
    })
    app.get('/second',function(req,res){
    	res.send("response from second");
    })
    app.get('/level/A',function(req,res){
    	res.redirect('../B');
    })
    app.get('/level/B',function(req,res){
    	res.send("response from B");
    })
    

    5.实现一个模板引擎  

    使用模板文件和应用程序数据,借助模板引擎生成HTML。

    基于应用程序提供的值,使用template对象创建HTML。

    好处:

    简单:模板尽量做到容易生成HTML,要么用速记符号,要么允许把javascript直接嵌入在HTML中

    速度:模板引擎优化构建HTML文档的过程。许多进程编译一个模板并把编译后的版本储存在用于加快HTML响应生成速度的缓存中。  

    Jade,内嵌的JavaScript(EJS)

    Jade使用HTML速记符号模板,模板文件看上去不似html

    优点:模板文件小,易于掌握。缺点:需要学习

    EJS使用特殊的符号在HTML中嵌入javascript

    1)定义模板引擎

    通过在express()应用程序对象上 对view engine设定进行设置

    把views设定设置为模板文件存放的位置。

    var app=express();
    app.set('views','./views');
    app.set('view engine','jade');
    

    使用app.engine(ext,callback) 处理模板扩展名注册模板引擎

    ext 用于模板文件的文件扩展名

    callback 支持Express的呈现功能的函数

    app.engine('jade',require('jade')._express)    _express功能只能在默认文件扩展名上工作。(但比如ejs可以使用ejs的renderFile注册)

    app.engine('ejs',require('ejs')._express)

    app.engine('html',require('ejs').renderFile)    为HTML扩展名注册ejs

    2)加入本地对象

    在呈现模板引擎时,可能需要包括动态数据。

    app.locals.title="My App";

    app.locals.version=10

    3)创建模板

    可重用性:让模板可在应用程序的其他部分和其他应用中重复使用。

    规模:将模板根据他们表示的数据类型分类。

    层次:按照某种层次建立。

    4)在响应中呈现模板

    app.render(view,[local],callback)  

  • 相关阅读:
    204. 计数质数
    面试题 16.06. 最小差
    8. ubantu系统相关
    7. 理论
    6. 图像处理
    5.git
    4.Torch量化
    3.Torch优化工具
    2.DB算法及代码问题分析
    1. 显卡相关问题
  • 原文地址:https://www.cnblogs.com/weizaiyes/p/6054241.html
Copyright © 2020-2023  润新知