一. 概述
Express是基于Node.js的Web开发框架。
实例:
Express框架建立在node.js内置的http模块上,其等于在http模块之上,加了一个中间层。
1.中间层(middleware)
中间件就是处理HTTP请求的函数,在一个中间件处理完后,再传递给下一个中间件。
每个中间件可以从App实例接收三个参数即request对象(代表HTTP请求)、response对象(代表HTTP回应),next回调函数(代表下一个中间件)。
每个中间件都可以对HTTP请求(request对象)进行加工,并且决定是否调用next方法,将request对象再传给下一个中间件。
2. use方法
use是express注册中间件的方法,它返回一个函数。
(1) all方法和HTTP动词方法
针对不同的请求,Express提供了use方法的一些别名。
set方法用于指定变量的值。
(1)response.redirect方法允许网址的重定向。
response.redirect("http://www.example.com");
response.redirect(301, "http://www.example.com");
(2)response.sendFile方法用于发送文件。
response.sendFile("/path/to/anime.mp4");
(3)response.render方法用于渲染网页模板。
5. request对象
(1)request.ip属性用于获得HTTP请求的IP地址。
(2)request.files用于获取上传的文件。
四. 开发实例
1. 编写启动脚本
项目根目录下新建app.js,如下:
Express支持多种模板引擎,如采用ejs模板引擎。
安装完模板引擎后,改写app.js:
1.基本用法
(1)Express.Router是一个构造函数,调用后返回一个路由器实例。
(2)使用该实例的HTTP动词方法,为不同的访问路径,指定回调函数;
(3)将路由挂载到某个路径。
如挂载到根路径下的路由实例:
router实例对象的route方法,可以接受访问路径作为参数。
use方法为router对象指定中间件,即在数据正式发给用户之前,对数据进行处理。
router对象的param方法用于路径参数的处理:
http://www.expressjs.com.cn/
Express是基于Node.js的Web开发框架。
实例:
//根目录下新建启动文件index.js
var express = require('express');
var app = express();
//浏览器请求文件定位到public子目录
app.use(express.static(__dirname + '/public'));
//app.get方法用于指定不同的访问路径所对应的回调函数即“路由”
app.get('/', function (req, res) {
res.send('Hello world!');
});
app.get('/customer', function(req, res){
res.send('customer page');
});
app.listen(8080);
二.运行原理
Express框架建立在node.js内置的http模块上,其等于在http模块之上,加了一个中间层。
1.中间层(middleware)
中间件就是处理HTTP请求的函数,在一个中间件处理完后,再传递给下一个中间件。
每个中间件可以从App实例接收三个参数即request对象(代表HTTP请求)、response对象(代表HTTP回应),next回调函数(代表下一个中间件)。
每个中间件都可以对HTTP请求(request对象)进行加工,并且决定是否调用next方法,将request对象再传给下一个中间件。
2. use方法
use是express注册中间件的方法,它返回一个函数。
var express = require("express");
var http = require("http");
var app = express();
app.use(function(request, response, next) {
console.log("In comes a " + request.method + " to " + request.url);
next();
});
//use方法内部可以对访问路径进行判断实现简单的路由
app.use(function(request, response, next) {
if (request.url == "/about") {
response.writeHead(200, { "Content-Type": "text/plain" });
} else {
next();
}
});
//use方法也允许将请求网址写在第一个参数
app.use('/path', someMiddleware);
http.createServer(app).listen(1337);
3. Express方法
(1) all方法和HTTP动词方法
针对不同的请求,Express提供了use方法的一些别名。
var express = require("express");
var http = require("http");
var app = express();
//“*”表示对所有路径有效,所有请求都必须通过该中间件
app.all("*", function(request, response, next) {
response.writeHead(200, { "Content-Type": "text/plain" });
next();
});
//get方法是只有GET动词的HTTP请求通过该中间件,Express还提供post、put、delete方法,即HTTP动词都是Express的方法。
app.get("/about", function(request, response) {
response.end("Welcome to the about page!");
});
//Express允许模式匹配,如匹配“/hello/alice”网址,其中的alice将被捕获,作为req.params.who属性的值
app.get("/hello/:who", function(req, res) {
res.end("Hello, " + req.params.who + ".");
});
//若在模式参数后面加上问号,表示该参数可选
app.get('/hello/:who?',function(req,res) {
if(req.params.id) {
res.end("Hello, " + req.params.who + ".");
}
else {
res.send("Hello, Guest.");
}
});
app.get("*", function(request, response) {
response.end("404!");
});
http.createServer(app).listen(1337);
(2)set方法
set方法用于指定变量的值。
app.set("views", __dirname + "/views");
app.set("view engine", "jade");
4. response对象
(1)response.redirect方法允许网址的重定向。
response.redirect("http://www.example.com");
response.redirect(301, "http://www.example.com");
(2)response.sendFile方法用于发送文件。
response.sendFile("/path/to/anime.mp4");
(3)response.render方法用于渲染网页模板。
app.get("/", function(request, response) {
response.render("index", { message: "Hello World" });
});
使用render方法,将message变量传入index模板,渲染成HTML网页。
5. request对象
(1)request.ip属性用于获得HTTP请求的IP地址。
(2)request.files用于获取上传的文件。
四. 开发实例
1. 编写启动脚本
项目根目录下新建app.js,如下:
var express = require('express');
var app = express();
// 设定port变量,意为访问端口
app.set('port', process.env.PORT || 3000);
// 设定views变量,意为视图存放的目录
app.set('views', path.join(__dirname, 'views'));
// 设定view engine变量,意为网页模板引擎
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
//指定根路径
app.get('/', function(req, res) {
res.send('Hello World');
});
//发送静态网页模板
app.get('/about', function(req, res) {
res.sendfile('./views/about.html');
});
app.listen(app.get('port'));
2. 动态网页模板
Express支持多种模板引擎,如采用ejs模板引擎。
安装完模板引擎后,改写app.js:
var express = require('express');
var app = express();
// 加载ejs模块
var ejs = require('ejs');
var js = (args.length > 1 ? args[1] : '') + '/js/';
var style = args.length === 2 ? args[1] : (args.length === 1 ? args[0] : 'default');
app.set('port', process.env.PORT || 8080);
app.set('views', __dirname);
// 指定模板文件的后缀名为html
app.set('view engine', 'html');
// 运行ejs模块
app.engine('.html', ejs.__express);
app.set('view engine', 'html');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser());
//render方法的参数就是模板的文件名,默认放在子目录views之中,第二个参数表示模板变量绑定的数据。
app.get('/index', function(req, res) {
res.render('index', {
title: '首页',
style: style,
css: style + '/css/index.css',
js: js + 'index.js'
});
});
app.listen(app.get('port'));
其中index.html文件内容为:
<!DOCTYPE html>
<html lang="en" ng-app="app">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no" />
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<meta name="format-detection" content="telephone=no" />
<meta name="format-detection" content="email=no" />
<title><%= title %></title>
<link href="/dist/<%= css %>" rel="stylesheet" />
<script>
(function() {
window.env = 'dev';
window.basePath = '';
window.staticPath = '<%= style %>';
window.restPath = '';
})();
</script>
</head>
<body class="root" ng-controller="gRoot">
<div class="g-page" ui-view id="wrap"></div>
<script src="/dist<%= js %>"></script>
</body>
</html>
五. Express.Router用法
1.基本用法
(1)Express.Router是一个构造函数,调用后返回一个路由器实例。
(2)使用该实例的HTTP动词方法,为不同的访问路径,指定回调函数;
(3)将路由挂载到某个路径。
如挂载到根路径下的路由实例:
var router = express.Router();
router.get('/', function(req, res) {
res.send('首页');
});
router.get('/about', function(req, res) {
res.send('关于');
});
//相当于为/app和/app/about这两个路径,指定了回调函数。
app.use('/app', router);
2.router.route方法
router实例对象的route方法,可以接受访问路径作为参数。
router.route('/api')
.post(function(req, res) {
// ...
})
.get(function(req, res) {
Bear.find(function(err, bears) {
if (err) res.send(err);
res.json(bears);
});
});
3. router中间件
use方法为router对象指定中间件,即在数据正式发给用户之前,对数据进行处理。
router.use(function(req, res, next) {
console.log(req.method, req.url);
next();
});
4.对路径参数的处理
router对象的param方法用于路径参数的处理:
router.param('name', function(req, res, next, name) {
// 对name进行验证或其他处理……
console.log(name);
req.name = name;
next();
});
//param方法必须放在HTTP动词方法之前。
router.get('/hello/:name', function(req, res) {
res.send('hello ' + req.name + '!');
});
参考:http://javascript.ruanyifeng.com/nodejs/express.html
http://www.expressjs.com.cn/