Nodejs.express

express简介
  • Express是一个简洁、灵活的node.js Web应用开发框架, 它提供一系列强大的功能,比如:模板解析、静态文件服务、中间件、路由控制等等,并且还可以使用插件或整合其他模块来帮助你创建各种 Web和移动设备应用,是目前最流行的基于Node.js的Web开发框架,并且支持Ejs、jade等多种模板,可以快速地搭建一个具有完整功能的网站。
Express 框架核心特性:
  • 可以设置中间件来响应 HTTP 请求。

  • 定义了路由表用于执行不同的 HTTP 请求动作。

  • 可以通过向模板传递参数来动态渲染 HTML 页面。

安装
 cnpm install express --save
下面有几个重要的模块是需要与 express 框架一起安装的:
 cnpm install body-parser --save
 cnpm install cookie-parser --save
 cnpm install multer --save
  • body-parser - node.js中间件,用于处理 JSON, Raw, Text 和 URL 编码的数据。
  • cookie-parser - 这就是一个解析Cookie的工具。通过req.cookies可以取到传过来的cookie,并把它们转成对象。
  • multer - node.js 中间件,用于处理enctype="multipart/form-data"(设置表单的MIME编码)的表单数据。
创建应用
var express = require('express'); var app = express();
app.get('/', function (request, response) {
  response.send('Hello World!');
});
 
app.listen(80);
get 请求 express_demo.js文件代码
  • get方法 —— 根据请求路径来处理客户端发出的GET请求。
  • 格式:app.get(path,function(request, response));
  • path为请求的路径,第二个参数为处理请求的回调函数,有两个参数分别是request和response,代表请求信息和响应信息。
var express = require('express');
var app = express();
 
app.get('/', function (req, res) {
   res.send('Hello World');
})
 
var server = app.listen(8081, function () {
 
  var host = server.address().address
  var port = server.address().port
  console.log("应用实例,访问地址为 http://%s:%s", host, port)
 
})
 运行 node express_demo.js 
  • 第二种例子
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);
注册路由:接收请求 处理请求 做出响应 和 next()
//app.get(路径名:可以是字符串正则表达式,回调函数)
app.get('/b', (req, res, next) => {
    next("route")//跳出当前控制器,移交控制权 next()交给下一个路有句柄(必须同路径名)
    res.end('b')
})
app.listen(1314)
  • 请求:方式 路径
  • 路由=http方法 + 服务端路径
  • 作用:接收请求 处理请求 做出响应
  • ck什么时候执行:发起请求且路由匹配 (客户端的请求方式服务器路由方法 客户端的请求路径服务端路径)
注册路由的方法:
  • app.get app.post app.all
  • ab+cd 匹配b 1-多次
  • ab?cd 匹配b 0-1
  • ab*cd 匹配ab开头 cd结尾
  • 路由路径:字符串 字符串模式 正则表达式
中间件<Middleware>
  • 中间件(middleware)就是处理HTTP请求的函数,用来完成各种特定的任务,比如检查用户是否登录、分析数据、以及其他在需要最终将数据发送给用户之前完成的任务。 它最大的特点就是,一个中间件处理完,可以把相应数据再传递给下一个中间件。
 一个不进行任何操作、只传递request对象的中间件,大概是这样:
function Middleware(request, response, next) {
  next();
}

上面代码的next为中间件的回调函数。如果它带有参数,则代表抛出一个错误,参数为错误文本。
function Middleware(request, response, next) {
  next('出错了!');
}
应用级中间件:
应用级中间件绑定到 app 对象 使用 app.use() 和 app.METHOD()
路由级中间件:
路由级中间件和应用级中间件一样,只是它绑定的对象为 express.Router()
内置中间件:处理静态资源
  • express.static 是 Express内置的中间件。它基于 serve-static,负责在 Express 应用中提托管(处理)静态资源。

  • 通过 Express 内置的 express.static 可以方便地托管静态文件,例如图片、CSS、JavaScript 文件等。

  • 如果你的静态资源存放在多个目录下面,你可以多次调用 express.static 中间件
    。该root参数指定从中提供静态资产的根目录。该函数通过req.url与提供的root目录结合来确定要提供的文件。
    。 当找不到文件时,它不是发送404响应,而是调用next()继续下一个中间件

all函数的基本用法
  • 和get函数不同app.all()函数可以匹配所有的HTTP动词,也就是说它可以过滤所有路径的请求,如果使用all函数定义中间件,那么就相当于所有请求都必须先通过此该中间件。

  • 格式:app.all(path,function(request, response));

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.listen(80);

这个方法在给特定前缀路径或者任意路径上处理时会特别有用,不管我们请求任何路径都会事先经过all函数。
use基本用法1
  • 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(),表示将请求数据传递给下一个中间件。
use基本用法2
  • 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) {
});
  • 获取主机名、路径名
  1. req.host返回请求头里取的主机名(不包含端口号)。

  2. 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()
通过req查看主机名或请求路径。
query基本用法
  • query是一个可获取客户端get请求路径参数的对象属性,包含着被解析过的请求参数对象,默认为{}。
ar 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.参数名
param基本用法
  • 和属性query一样,通过req.param我们也可以获取被解析过的请求参数对象的值。

  • 格式:req.param(“参数名”);

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)

我们也可以获取具有相应路由规则的请求对象,假设路由规则为 /user/:name/,请求路径/user/mike,如下:
app.get("/user/:name/", function(req, res) {
  console.log(req.param("name")); //mike   res.send("使用req.param属性获取具有路由规则的参数对象值!");
});
params基本用法
  • 和param相似,但params是一个可以解析包含着有复杂命名路由规则的请求对象的属性。
  • 格式:req.params.参数名;
var express = require('express'); var app = express();
1. app.get("/user/:name/", function(req, res) {
  console.log(req.params.name); //mike   res.send("使用req.params属性获取具有路由规则的参数对象值!");
});
app.listen(80);

当然我们也可以请求复杂的路由规则,如/user/:name/:id,假设请求地址为:/user/mike/123,如下:

2. app.get("/user/:name/:id", function(req, res) {
  console.log(req.params.id); //"123"   res.send("使用req.params属性复杂路由规则的参数对象值!");
});
send基本用法
  • 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缓存支持等等

Request 对象 - request 对象表示 HTTP 请求,包含了请求查询字符串,参数,内容,HTTP 头部等属性。常见属性有:
req.app:当callback为外部文件时,用req.app访问express的实例
req.baseUrl:获取路由当前安装的URL路径
req.body / req.cookies:获得「请求主体」/ Cookies
req.fresh / req.stale:判断请求是否还「新鲜」
req.hostname / req.ip:获取主机名和IP地址
req.originalUrl:获取原始请求URL
req.params:获取路由的parameters
req.path:获取请求路径
req.protocol:获取协议类型
req.query:获取URL的查询参数串
req.route:获取当前匹配的路由
req.subdomains:获取子域名
req.accepts():检查可接受的请求的文档类型
req.acceptsCharsets / req.acceptsEncodings / req.acceptsLanguages:返回指定字符集的第一个可接受字符编码
req.get():获取指定的HTTP请求头
req.is():判断请求头Content-Type的MIME类型
Response 对象 - response 对象表示 HTTP 响应,即在接收到请求时向客户端发送的 HTTP 响应数据。常见属性有:
res.app:同req.app一样
res.append():追加指定HTTP头
res.set()在res.append()后将重置之前设置的头
res.cookie(name,value [,option]):设置Cookie
opition: domain / expires / httpOnly / maxAge / path / secure / signed
res.clearCookie():清除Cookie
res.download():传送指定路径的文件
res.get():返回指定的HTTP头
res.json():传送JSON响应
res.jsonp():传送JSONP响应
res.location():只设置响应的Location HTTP头,不设置状态码或者close response
res.redirect():设置响应的Location HTTP头,并且设置状态码302
res.render(view,[locals],callback):渲染一个view,同时向callback传递渲染后的字符串,如果在渲染过程中有错误发生next(err)将会被自动调用。callback将会被传入一个可能发生的错误以及渲染后的页面,这样就不会自动输出了。
res.send():传送HTTP响应
res.sendFile(path [,options] [,fn]):传送指定路径的文件 -会自动根据文件extension设定Content-Type
res.set():设置HTTP头,传入object可以一次设置多个头
res.status():设置HTTP状态码
res.type():设置Content-Type的MIME类型
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值