nodejs框架express快速开始
- 认识express
- 创建应用
- get请求
- 简述中间件
- all方法
- use方法1
- use方法2
- 回调函数
- 获取主机、路径名
- Get请求 - query
- Get请求 - param
- Get请求 - params
- send
Express介绍
npm提供了大量的第三方模块,其中不乏许多Web框架,比如我们本章节要讲述的一个轻量级的Web框架 ——— Express。
Express是一个简洁、灵活的node.js Web应用开发框架, 它提供一系列强大的功能,比如:模板解析、静态文件服务、中间件、路由控制等等,并且还可以使用插件或整合其他模块来帮助你创建各种 Web和移动设备应用,是目前最流行的基于Node.js的Web开发框架,并且支持Ejs、jade等多种模板,可以快速地搭建一个具有完整功能的网站。
好,下面我们就开始吧!
1. NPM安装
- npm install express
2. 获取、引用
var express = require('express');
var app = express();
通过变量“app”我们就可以调用express的各种方法了,好戏刚刚开始,继续加油吧!
创建应用
认识了Express框架,我们开始创建我们的第一个express应用。
在我们的默认项目主文件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应用已经创建成功了。
get请求
前面我们实现了一个简单的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方法,表示向浏览器发送一个字符串。
Middleware<中间件>
1.什么是中间件?
中间件(middleware)就是处理HTTP请求的函数,用来完成各种特定的任务,比如检查用户是否登录、分析数据、以及其他在需要最终将数据发送给用户之前完成的任务。 它最大的特点就是,一个中间件处理完,可以把相应数据再传递给下一个中间件。
2.一个不进行任何操作、只传递request对象的中间件,大概是这样:
function Middleware(request, response, next) {
next();
}
上面代码的next为中间件的回调函数。如果它带有参数,则代表抛出一个错误,参数为错误文本。
function Middleware(request, response, next) {
next('出错了!');
}
抛出错误以后,后面的中间件将不再执行,直到发现一个错误处理函数为止。如果没有调用next方法,后面注册的函数也是不会执行的。
all函数的基本用法
和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函数。
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(),表示将请求数据传递给下一个中间件。
上面代码先调用第一个中间件,在控制台输出一行信息,然后通过next(),调用第二个中间件,输出HTTP回应。由于第二个中间件没有调用next方法,所以req对象就不再向后传递了。
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) {
- });
在后面的学习中,我们会经常和它打交道,牢牢记住它的格式吧!
获取主机名、路径名
今天我们就先来学习如何使用req对象来处理客户端发来的HTTP请求。
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(80);
query基本用法
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"
param基本用法
和属性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:所谓“路由”,就是指为不同的访问路径,指定不同的处理方法。
params基本用法
和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基本用法
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缓存支持等等。
nodejs框架express快速开始的更多相关文章
- NodeJS 框架 Express 从 3.0升级至4.0的新特性
NodeJS 框架 Express 从 3.0升级至4.0的新特性 [原文地址:√https://scotch.io/bar-talk/expressjs-4-0-new-features-and-u ...
- [转] NodeJS框架express的途径映射(路由)功能及控制
NodeJS框架express的路径映射(路由)功能及控制 我们知道Express是一个基于NodeJS的非常优秀的服务端开发框架,本篇CSSer将提供express框架的route和route co ...
- 知名nodeJS框架Express作者宣布弃nodeJS投Go
知名 nodeJS 框架 Express 的作者 TJ Holowaychuk 在 Twitter 发推并链接了自己的一篇文章,宣布弃 nodeJS 投 Go. 他给出的理由是:Go 语言和 Rust ...
- nodejs框架express准备登录
目录: 安装模板 静态资源 添加视图 渲染视图 url重定向 模板引擎 从本节课程开始我们要使用express框架实现一个简单的用户登陆功能,让我们先准备一下相关资源. 在nodejs中使用expre ...
- NodeJS框架express的路径映射(路由)功能及控制
我 们知道Express是一个基于NodeJS的非常优秀的服务端开发框架,本篇CSSer将提供express框架的route和route control章节,route实现了客户端请求的URL的路径映 ...
- CentOS安装运行NodeJS框架Express
安装依赖包 yum -y install gcc make gcc-c++ openssl-devel wget 下载/解压NodeJs wget http://nodejs.org/dist/v0. ...
- nodejs框架express实现登录
目录: 访问视图 Post请求 Post请求 - body(1) Post请求 - body(2) Post登陆1 Post登陆2 页面访问控制1 页面访问控制2 访问视图 前面我们已经添加了视图模板 ...
- (转)windows下安装nodejs及框架express
转自:http://jingyan.baidu.com/article/456c463b60fb380a583144a9.html windows下安装nodejs及框架express nodejs从 ...
- nodejs的Express框架源码分析、工作流程分析
nodejs的Express框架源码分析.工作流程分析 1.Express的编写流程 2.Express关键api的使用及其作用分析 app.use(middleware); connect pack ...
随机推荐
- 全浏览器收藏网站javascript
function MyFavorite(sURL, sTitle) { var ctrl = (navigator.userAgent.toLowerCase()).indexOf('mac') != ...
- Objective-c的内存管理MRC与ARC
Objective-c的内存管理MRC与ARC Objective-c中提供了两种内存管理机制MRC(MannulReference Counting)和ARC(Automatic Referen ...
- tab1
<html> <head> <meta charset="UTF-8"> <title>tab</title> < ...
- WPF 程序启动显示为通知区域的图标方法
首先需要引用 System.Windows; System.Drawing; public partial class MainWindow : Window { public MainWindo ...
- bzoj1855: [Scoi2010]股票交易--单调队列优化DP
单调队列优化DP的模板题 不难列出DP方程: 对于买入的情况 由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]} AP[i]*j是固定的,在队列中维护dp[i-w ...
- 字符串—strcpy
来自——百度百科 原型声明:char *strcpy(char* dest, const char *src); 头文件:#include <string.h> 和 #include ...
- 在win7下安装unbuntu系统
1.分盘 准备EasyBCD,ubuntu操作系统 配置EasyBCD,安装ubuntu http://www.linuxidc.com/Linux/2014-04/100369.htm http:/ ...
- 一些常用的NLTK频率分布类中定义的函数
fdist=FreqDist(samples)创建包含给定样本的频率分布fist.inc(sample)增加样本fdist['monstrous']计数给定样本出现的次数fdist.freq('mon ...
- MyEclipse tomcat7.x 自定义项目部署路径
- EL表达式与JSTL
内容包括 EL表达式 EL函数库 JSTL 核心标签库 格式化标签库 SQL标签库 XML标签库 自定义标签库 EL表达式 EL是Expression Language的是缩写,是JSP页面编写的一种 ...