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:\t "+req.originalUrl);
	console.log("Protocol:\t "+req.protocol);
	console.log("IP:\t "+req.ip);
	console.log("Path:\t "+req.path);
	console.log("Host:\t "+req.host);
	console.log("Method:\t "+req.method);
	console.log("Query:\t "+JSON.stringify(req.query));
	console.log("Fresh:\t "+req.fresh);
	console.log("Stale:\t "+req.stale);
	console.log("Secure:\t "+req.secure);
	console.log("utf8:\t "+req.acceptsCharset('utf8'));
	console.log("Connetion:\t "+req.get('connetion'));
	console.log("Headers:\t "+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('\nHeaders 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)  

1.Express入门的更多相关文章

  1. Express - 入门

    Express入门篇 1.HelloWorld  根目录新建server.js文件,插入代码: var express = require('express'); var app = express( ...

  2. Nodejs学习总结 -Express入门(一)

    Express是基于Node.js平台开发的Web应用开发框架,下面我们入手学习. 官网 : http://www.expressjs.com.cn/ github:https://github.co ...

  3. Node.js 之 express 入门 ejs include公共部分

    1. 直接进入express安装 因为之前有一篇文章我已经讲过怎么安装node了 而网上的教程也是非常多.所有直接进入到express.教程简陋 由于我比较笨 所有只要写到我自己明白就行. 这里有个教 ...

  4. 转:基于node的web开发框架Express入门

    JavaScript 标准参考教程(alpha) 草稿二:Node.js Express框架 GitHub TOP Express框架 来自<JavaScript 标准参考教程(alpha)&g ...

  5. node.js,express入门看详细篇

    先最简单的代码 安装 npm install express app.js 代码内容 const express = require('express') const app = express() ...

  6. NodeJS+Express+Socket.io的一个简单例子

    关键字:NodeJS,Express,Socket.io. OS:Windows 8.1 with update pro. 1.安装NodeJS:http://nodejs.org/. 2.初始化一个 ...

  7. 我们是怎么管理QQ群的

    文章背景:腾讯平台上的qq群数以千万百万计,但99%的在吹水扯蛋,从早上的问好开始,到晚上的晚安,无一不浪费青春之时间,看之痛心,无力改变,只好自己建了一个,希望能以此来改变群内交流的氛围或环境. 以 ...

  8. github上最全的资源教程-前端涉及的所有知识体系

    前面分享了前端入门资源汇总,今天分享下前端所有的知识体系. 个人站长对个人综合素质要求还是比较高的,要想打造多拉斯自媒体网站,不花点心血是很难成功的,学习前端是必不可少的一个环节, 当然你不一定要成为 ...

  9. 前端资料QQ群交流

    转:https://github.com/jsfront/src/blob/master/qq.md 这本来是我QQ群内部的一份公共约定的日常交流规则,后来得到大伙的一致认可,并用实际行动来捍卫它,使 ...

随机推荐

  1. 【ps】裁剪图片的某一块

    最近做我趣的专辑学了一点小技巧,我们切图的时候可能需要改变图片上的文字.需要图片某一部分的颜色块进行覆盖等.这时候就需要下面的技巧啦: 第一步:点v,变箭头选中图片 第二部:点M,变矩形框,划出需要裁 ...

  2. 前端js面试中的常见的算法问题

    虽说我们很多时候前端很少有机会接触到算法.大多都交互性的操作,然而从各大公司面试来看,算法依旧是考察的一方面.实际上学习数据结构与算法对于工程师去理解和分析问题都是有帮助的.如果将来当我们面对较为复杂 ...

  3. easyui 日期控件清空值

    最近用了Easyui的日期控件datebox,项目中要将选中值清空,于是就研究了一下. 1,调用方法清空 $('#yourId').combo('setText',''); 2,更改js文件 从官网下 ...

  4. sql server 2008 相关基础(物理备份还原)

    1. restore database KLJY_juncsoft from disk= 'D:\\kljy_2012_12_28.bak' with recovery 注意在还原时,进度一直显示0% ...

  5. ubuntu 16.04 挂起后WiFi链接不上

    在笔记本上安装ubuntu 16.04后,使用挂起系统功能后发现WIFI链接不上去,然后使用以下指令多WIFI服务进行重启,发觉可以了. sudo service network-manager re ...

  6. [LintCode] Flatten Binary Tree to Linked List 将二叉树展开成链表

    Flatten a binary tree to a fake "linked list" in pre-order traversal. Here we use the righ ...

  7. SourceTree 免登录跳过初始设置

    SourceTree 安装之后需要使用账号登陆以授权,以前是可以不登陆的,但是现在是强制登陆. 虽然是免费授权,但是碰上不可抗力因素,登陆不是很方便,这里记录一下跳过这个初始化的步骤. 安装之后,转到 ...

  8. windows+linux开发环境 解决laravel blade模板缓存问题

    编码环境windows10 编码IDE:phpstorm 2016.2 PHP框架:laravel5.3 + 代码运行环境:centos7 + nginx 在开发过程中,上传blade模板文件到lin ...

  9. GCD常用剖析

    介绍:Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统.这建立在任务并行执行的线程池模式的基础上的.它首次 ...

  10. css3写出0.5px的边框

    一说到0.5px的边框,我们一般认为是不行的,因为在ps中0.5px的线也是做不出来的,这个计算机的像素有关系. 废话不多说了,0.5px 其实用的是css3新特性,box-shadow:阴影设置 代 ...