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:\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入门的更多相关文章
- Express - 入门
Express入门篇 1.HelloWorld 根目录新建server.js文件,插入代码: var express = require('express'); var app = express( ...
- node.js Web应用框架Express入门指南
node.js Web应用框架Express入门指南 作者: 字体:[增加 减小] 类型:转载 时间:2014-05-28 我要评论 这篇文章主要介绍了node.js Web应用框架Express入门 ...
- Nodejs学习总结 -Express入门(一)
Express是基于Node.js平台开发的Web应用开发框架,下面我们入手学习. 官网 : http://www.expressjs.com.cn/ github:https://github.co ...
- Node.js 之 express 入门 ejs include公共部分
1. 直接进入express安装 因为之前有一篇文章我已经讲过怎么安装node了 而网上的教程也是非常多.所有直接进入到express.教程简陋 由于我比较笨 所有只要写到我自己明白就行. 这里有个教 ...
- 转:基于node的web开发框架Express入门
JavaScript 标准参考教程(alpha) 草稿二:Node.js Express框架 GitHub TOP Express框架 来自<JavaScript 标准参考教程(alpha)&g ...
- node.js,express入门看详细篇
先最简单的代码 安装 npm install express app.js 代码内容 const express = require('express') const app = express() ...
- express入门
(1)express的安装 $ npm install express 或者 $ npm install -g express 或者 $ npm install express -gd 备注: -g ...
- Express学习(1) ------Express 入门
Express 是node 第三方框架,大家都知道,框架的意义就在于能大大简化程序地开发.那么我们就看一下Express是怎么简化node程序开发的. 1,用Express写一个hello world ...
- Express入门介绍vs实例讲解
下午在团队内部分享了express相关介绍,以及基于express的实例.内容提纲如下. 什么是Express 为什么要用Express 路由规则 一切皆中间件 实例:Combo Applicatio ...
随机推荐
- 第二章 存储,2.2 AliCloudDB--双11商家后台数据库的基石(作者:玄惭)
2.2 AliCloudDB--双11商家后台数据库的基石 前言 2016年天猫双11购物狂欢节已经完美落下帷幕,千亿成交的背后,作为整个天猫商家后台数据库的基石,AliCloudDB是如何保障在零点 ...
- LyX-220-Installer-3
所见即所得 单独安装这个写作业可以了,要发论文用CTeX Ctrl + M 打开数学输入,里面可以输入 TeX 代码
- sql FOR XML PATH
FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...
- php操作大文件
看了http://hi.baidu.com/qiaoyuetian/item/76c51f0ce25030e4f45ba69e(php读取大文件详解),然后测试了里边的代码,发现一些错误, 总结,红色 ...
- js实现-下拉列表左右选择
下拉列表左右选择 * 下拉选择框 <select> <option>111</opt ...
- Orchard源码分析(5.3):EndRequest事件处理(DefaultOrchardHost.EndRequest方法)
EndRequest事件处理的作用是处理完"处理引擎(ProcessingEngine)"中的任务(Task). void IOrchardHost .EndR ...
- linux静态库的生成与使用(转)
linux静态库的生成与使用(转) 库是一种软件组件技术,库里面封装了数据和函数. 库的使用可以使程序模块化. Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件). Linu ...
- Apache ab参数--压力测试
Apache附带的ab,它非常容易使用,ab可以直接在Web服务器本地发起测试请求.这至关重要,因为我们希望测试的服务器的处理时间,而不包含数据的网络传输时间以及用户PC本地的计算时间. 需要清楚的是 ...
- CSS鼠标响应事件经过、移动、点击示例介绍
本文为大家介绍下CSS 鼠标响应事件:鼠标经过CSS.鼠标移动CSS.鼠标点击CSS以及示例,喜欢的朋友可以参考下 几种鼠标触发CSS事件. 说明: onMouseDown 按下鼠标时触发 onM ...
- javascript位运算
javascript作为一门高级语言,他尽量让开发人员减少思考底层的硬件工作原理,而将精力集中在逻辑开发的层面.不过,不论这门语言多么高级,我们必须知道数据依然以bits的形式存储,有时候我们会直接与 ...