npm提供了大量的第三方模块,其中不乏许多Web框架,好比咱们本章节要讲述的一个轻量级的Web框架 ——— Express。html
Express是一个简洁、灵活的node.js Web应用开发框架, 它提供一系列强大的功能,好比:模板解析、静态文件服务、中间件、路由控制等等,而且还可使用插件或整合其余模块来帮助你建立各类 Web和移动设备应用,是目前最流行的基于Node.js的Web开发框架,而且支持Ejs、jade等多种模板,能够快速地搭建一个具备完整功能的网站。node
好,下面咱们就开始吧!express
1. NPM安装npm
npm install express
2. 获取、引用浏览器
var express = require('express'); var app = express();
经过变量“app”咱们就能够调用express的各类方法了,好戏刚刚开始,继续加油吧!缓存
认识了Express框架,咱们开始建立咱们的第一个express应用。app
在咱们的默认项目主文件app.js添加以下内容:框架
var express = require('express'); var app = express(); app.get('/', function (request, response) { response.send('Hello World!'); }); app.listen(80);
说明:在后面课程学习中,咱们会统一使用80端口用于监听请求。函数
添加完毕以后,经过右侧栏的“测试地址”来查看浏览器内容,当看到“Hello World!”内容就代表一个简单的express应用已经建立成功了。学习
前面咱们实现了一个简单的express应用,下面咱们就开始具体讲述它的具体实现,首先咱们先来学习Express的经常使用方法。
get方法 —— 根据请求路径来处理客户端发出的GET请求。
格式:app.get(path,function(request, response));
path为请求的路径,第二个参数为处理请求的回调函数,有两个参数分别是request和response,表明请求信息和响应信息。
以下示例:
var express = require('express'); var app = express(); app.get('/', function(request, response) { response.send('Welcome to the homepage!'); }); app.get('/about', function(request, response) { response.send('Welcome to the about page!'); }); app.get("*", function(request, response) { response.send("404 error!"); }); app.listen(80);
上面示例中,指定了about页面路径、根路径和全部路径的处理方法。而且在回调函数内部,使用HTTP回应的send方法,表示向浏览器发送一个字符串。
参照以上代码,试试本身设定一个get请求路径,而后浏览器访问该地址是否能够请求成功。
1.什么是中间件?
中间件(middleware)就是处理HTTP请求的函数,用来完成各类特定的任务,好比检查用户是否登陆、分析数据、以及其余在须要最终将数据发送给用户以前完成的任务。 它最大的特色就是,一个中间件处理完,能够把相应数据再传递给下一个中间件。
2.一个不进行任何操做、只传递request对象的中间件,大概是这样:
function Middleware(request, response, next) { next(); }
上面代码的next为中间件的回调函数。若是它带有参数,则表明抛出一个错误,参数为错误文本。
function Middleware(request, response, next) { next('出错了!'); }
抛出错误之后,后面的中间件将再也不执行,直到发现一个错误处理函数为止。若是没有调用next方法,后面注册的函数也是不会执行的。
和get函数不一样app.all()函数能够匹配全部的HTTP动词,也就是说它能够过滤全部路径的请求,若是使用all函数定义中间件,那么就至关于全部请求都必须先经过此该中间件。
格式:app.all(path,function(request, response));
以下所示,咱们使用all函数在请求以前设置响应头属性。
var express = require("express"); var app = express(); app.all("*", function(request, response, next) { response.writeHead(200, { "Content-Type": "text/html;charset=utf-8" }); //设置响应头属性值 next(); }); app.get("/", function(request, response) { response.end("欢迎来到首页!"); }); app.get("/about", function(request, response) { response.end("欢迎来到about页面!"); }); app.get("*", function(request, response) { response.end("404 - 未找到!"); }); app.listen(80);
上面代码参数中的“*”表示对全部路径有效,这个方法在给特定前缀路径或者任意路径上处理时会特别有用,无论咱们请求任何路径都会事先通过all函数。
若是所示,若是咱们跳过all函数又会怎么样呢,本身动手试一试?
use是express调用中间件的方法,它返回一个函数。
格式:app.use([path], function(request, response, next){});
//可选参数path默认为"/"。
1. 使用中间件
app.use(express.static(path.join(__dirname, '/')));
如上呢,咱们就使用use函数调用express中间件设定了静态文件目录的访问路径(这里假设为根路径)。
2. 如何连续调用两个中间件呢,以下示例:
var express = require('express'); var app = express(); 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-8" }); response.end('示例:连续调用两个中间件'); }); app.listen(80);
回调函数的next参数,表示接受其余中间件的调用,函数体中的next(),表示将请求数据传递给下一个中间件。
上面代码先调用第一个中间件,在控制台输出一行信息,而后经过next(),调用第二个中间件,输出HTTP回应。因为第二个中间件没有调用next方法,因此req对象就再也不向后传递了。
use方法不只能够调用中间件,还能够根据请求的网址,返回不一样的网页内容,以下示例:
var express = require("express"); var app = express(); 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!"); }); app.listen(80);
上面代码经过request.url属性,判断请求的网址,从而返回不一样的内容。
Express回调函数有两个参数,分别是request(简称req)和response(简称res),request表明客户端发来的HTTP请求,request表明发向客户端的HTTP回应,这两个参数都是对象。示例以下:
function(req, res) { });
在后面的学习中,咱们会常常和它打交道,紧紧记住它的格式吧!
今天咱们就先来学习如何使用req对象来处理客户端发来的HTTP请求。
req.host返回请求头里取的主机名(不包含端口号)。
req.path返回请求的URL的路径名。
以下示例:
var express = require('express'); var app = express(); app.get("*", function(req, res) { console.log(req.path); res.send("req.host获取主机名,req.path获取请求路径名!"); }); app.listen(80);
试一试在浏览器中输入任意一个请求路径,经过req查看主机名或请求路径。
query是一个可获取客户端get请求路径参数的对象属性,包含着被解析过的请求参数对象,默认为{}。
var express = require('express'); var app = express(); app.get("*", function(req, res) { console.log(req.query.参数名); res.send("测试query属性!"); }); app.listen(80);
经过req.query获取get请求路径的对象参数值。
格式:req.query.参数名;请求路径以下示例:
例1: /search?n=Lenka
req.query.n // "Lenka"
例2: /shoes?order=desc&shoe[color]=blue&shoe[type]=converse
req.query.order // "desc" req.query.shoe.color // "blue" req.query.shoe.type // "converse"
试一试get请求一个带参数路径,使用“req.query.参数名”方法获取请求参数值。
和属性query同样,经过req.param咱们也能够获取被解析过的请求参数对象的值。
格式:req.param("参数名");请求路径以下示例:
例1: 获取请求根路径的参数值,如/?n=Lenka,方法以下:
var express = require('express'); var app = express(); app.get("/", function(req, res) { console.log(req.param("n")); //Lenka res.send("使用req.param属性获取请求根路径的参数对象值!"); }); app.listen(80);
例2:咱们也能够获取具备相应路由规则的请求对象,假设路由规则为 /user/:name/,请求路径/user/mike,以下:
app.get("/user/:name/", function(req, res) { console.log(req.param("name")); //mike res.send("使用req.param属性获取具备路由规则的参数对象值!"); });
PS:所谓“路由”,就是指为不一样的访问路径,指定不一样的处理方法。
看了上面的示例,试一试使用req.param属性解析一个请求路径对象,并获取请求参数值。
和param类似,但params是一个能够解析包含着有复杂命名路由规则的请求对象的属性。
格式:req.params.参数名;
例1. 如上课时请求根路径的例子,咱们就能够这样获取,以下:
var express = require('express'); var app = express(); app.get("/user/:name/", function(req, res) { console.log(req.params.name); //mike res.send("使用req.params属性获取具备路由规则的参数对象值!"); }); app.listen(80);
查看运行结果,和param属性功能是同样的,一样获取name参数值。
例2:固然咱们也能够请求复杂的路由规则,如/user/:name/:id,假设请求地址为:/user/mike/123,以下:
app.get("/user/:name/:id", function(req, res) { console.log(req.params.id); //"123" res.send("使用req.params属性复杂路由规则的参数对象值!"); });
对于请求地址具备路由规则的路径来讲,属性params比param属性是否是又强大了那么一点点呢!
send()方法向浏览器发送一个响应信息,并能够智能处理不一样类型的数据。格式以下:
res.send([body|status], [body]);
1.当参数为一个String时,Content-Type默认设置为"text/html"。
res.send('Hello World'); //Hello World
2.当参数为Array或Object时,Express会返回一个JSON。
res.send({ user: 'tobi' }); //{"user":"tobi"} res.send([1,2,3]); //[1,2,3]
3.当参数为一个Number时,而且没有上面提到的任何一条在响应体里,Express会帮你设置一个响应体,好比:200会返回字符"OK"。
res.send(200); // OK res.send(404); // Not Found res.send(500); // Internal Server Error
send方法在输出响应时会自动进行一些设置,好比HEAD信息、HTTP缓存支持等等。
更多示例和在线练习能够去这里看看:
http://www.hubwiz.com/course/544db33888dba01ef09d0682/