目录
曾经沧海难为水,除却巫山不是云。
本文为本人略读官网文档后的大略笔记,实在不适合他人阅读。
前言
Express:Web应用框架
核心特性:
1. 可通过设置中间件来响应http请求。
2. 可定义路由表去响应不同的http请求。
3. 可通过向模板传递参数来动态渲染HTML页面。
安装
cnpm install express --save
// node.js 中间件,用于处理 JSON, Raw, Text 和 URL 编码的数据
cnpm install body-parser --save
// 解析Cookie的工具。通过req.cookies可以取到传过来的cookie,并把它们转成对象
cnpm install cookie-parser --save
// 中间件,用于处理 enctype="multipart/form-data"(设置表单的MIME编码)的表单数据
cnpm install multer --save
1. Hello World
test.js
var express = require('express');
var app = express();
app.get('/', function (req, res) {
res.send('Hello World');
})
var server = app.listen(8088, function () {
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})
node test.js
应用实例,访问地址为 http://:::8088
浏览器输入http://127.0.0.1:8088,运行效果
2. 请求和响应
request对象 处理请求数据
response对象 处理响应数据
app.get('/', function (req, res) {
// --
})
request对象
包含了http请求的数据(请求查询字符串、参数、内容、HTTP头等属性。
1. req.app
当callback为外部文件时,用req.app访问express的实例
2. req.baseUrl
获取路由当前安装的URL路径
3. req.body / req.cookies
获取 请求体body、Cookies
4. req.fresh / req.stale
判断请求是否还「新鲜」
5. req.hostname / req.ip
获取主机名、IP地址
6. req.originalUrl
获取原始请求URL
7. req.params
获取路由的parameters
8. req.path
获取请求路径
9. req.protocol
获取协议类型
10. req.query
获取URL的查询参数串
11. req.route
获取当前匹配的路由
12. req.subdomains
获取子域名
13. req.accepts()
检查可接受的请求的文档类型
14. req.acceptsCharsets / req.acceptsEncodings / req.acceptsLanguages
返回指定字符集的第一个可接受字符编码
15. req.get()
获取指定的HTTP请求头
16. req.is()
判断请求头Content-Type的MIME类型
Response对象
包含了http响应的数据。
1. res.app
同req.app一样
2. res.append()
追加指定HTTP头
3. res.set()
在res.append()后将重置之前设置的头
4. res.cookie(name,value [,option])
设置Cookie
opition: domain / expires / httpOnly / maxAge / path / secure / signed
5. res.type()
设置Content-Type的MIME类型
6. res.clearCookie()
清除Cookie
7. res.download()
传送指定路径的文件
8. res.get()
返回指定的HTTP头
9. res.json()
传送JSON响应
10. res.jsonp()
传送JSONP响应
11. res.location()
只设置响应的Location HTTP头,不设置状态码或者close response
12. res.redirect()
设置响应的Location HTTP头,并且设置状态码302
13. res.render(view,[locals],callback)
渲染一个view,同时向callback传递渲染后的字符串,如果在渲染过程中有错误发生next(err)将会被自动调用。callback将会被传入一个可能发生的错误以及渲染后的页面,这样就不会自动输出了。
14. res.send()
传送HTTP响应
15. res.sendFile(path [,options] [,fn])
传送指定路径的文件 -会自动根据文件extension设定Content-Type
16. res.set()
设置HTTP头,传入object可以一次设置多个头
17. res.status()
设置HTTP状态码
3. 路由
路由负责提取http请求的URL以及GET/POST参数,然后指定谁来响应。
test.js
var express = require('express');
var app = express();
// 主页输出 "Hello World"
app.get('/', function (req, res) {
console.log("主页 GET 请求");
res.send('Hello GET');
})
// POST 请求
app.post('/', function (req, res) {
console.log("主页 POST 请求");
res.send('Hello POST');
})
// /del_user 页面响应
app.get('/del_user', function (req, res) {
console.log("/del_user 响应 DELETE 请求");
res.send('删除页面');
})
// /list_user 页面 GET 请求
app.get('/list_user', function (req, res) {
console.log("/list_user GET 请求");
res.send('用户列表页面');
})
// 对页面 abcd, abxcd, ab123cd, 等响应 GET 请求
app.get('/ab*cd', function(req, res) {
console.log("/ab*cd GET 请求");
res.send('正则匹配');
})
var server = app.listen(8088, function () {
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})
node test.js
应用实例,访问地址为 http://:::8088
浏览器输入http://127.0.0.1:8088/list_user,运行效果
浏览器输入http://127.0.0.1:8088/abcd,运行效果
浏览器输入http://127.0.0.1:8088/abcde,运行效果
4. 静态文件
Express提供了内置的中间件express.static来设置静态文件路径(图片, CSS, JavaScript) 。
app.use('/public', express.static('public'));
例1
创建public目录,在public目录中创建images目录,存放1.jpg
test.js
var express = require('express');
var app = express();
app.use('/public', express.static('public'));
app.get('/', function (req, res) {
res.send('Hello World');
})
var server = app.listen(8088, function () {
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})
node test.js
应用实例,访问地址为 http://:::8088
浏览器输入http://127.0.0.1:8088/public/images/1.jpg,运行效果
5. GET 方法
- 例1
index.html
<html>
<body>
<form action="http://127.0.0.1:8088/process_get" method="GET">
First Name: <input type="text" name="first_name"> <br>
Last Name: <input type="text" name="last_name">
<input type="submit" value="Submit">
</form>
</body>
</html>
test.js
var express = require('express');
var app = express();
app.use('/public', express.static('public'));
app.get('/index.htm', function (req, res) {
res.sendFile( __dirname + "/" + "index.html" );
})
app.get('/process_get', function (req, res) {
// 输出 JSON 格式
var response = {
"first_name":req.query.first_name,
"last_name":req.query.last_name
};
console.log(response);
res.end(JSON.stringify(response));
})
var server = app.listen(8088, function () {
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})
node test.js
应用实例,访问地址为 http://:::8088
浏览器输入http://127.0.0.1:8088/index.htm,运行效果
submit
6. POST方法
- 例1
index.html
<html>
<body>
<form action="http://127.0.0.1:8088/process_post" method="POST">
First Name: <input type="text" name="first_name"> <br>
Last Name: <input type="text" name="last_name">
<input type="submit" value="Submit">
</form>
</body>
</html>
test.js
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
// 创建 application/x-www-form-urlencoded 编码解析
var urlencodedParser = bodyParser.urlencoded({ extended: false })
app.use('/public', express.static('public'));
app.get('/index.htm', function (req, res) {
res.sendFile( __dirname + "/" + "index.html" );
})
app.post('/process_post', urlencodedParser, function (req, res) {
// 输出 JSON 格式
var response = {
"first_name":req.body.first_name,
"last_name":req.body.last_name
};
console.log(response);
res.end(JSON.stringify(response));
})
var server = app.listen(8088, function () {
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})
node test.js
应用实例,访问地址为 http://:::8088
浏览器输入http://127.0.0.1:8088/index.htm,运行效果
submit
6. 文件上传
index.html
<html>
<head>
<title>文件上传表单</title>
</head>
<body>
<h3>文件上传:</h3>
选择一个文件上传: <br />
<form action="/file_upload" method="post" enctype="multipart/form-data">
<input type="file" name="image" size="50" />
<br />
<input type="submit" value="上传文件" />
</form>
</body>
</html>
test.js
var express = require('express');
var app = express();
var fs = require("fs");
var bodyParser = require('body-parser');
var multer = require('multer');
app.use('/public', express.static('public'));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(multer({ dest: '/tmp/'}).array('image'));
app.get('/index.htm', function (req, res) {
res.sendFile( __dirname + "/" + "index.html" );
})
app.post('/file_upload', function (req, res) {
console.log(req.files[0]); // 上传的文件信息
var des_file = __dirname + "/" + req.files[0].originalname;
fs.readFile( req.files[0].path, function (err, data) {
fs.writeFile(des_file, data, function (err) {
if( err ){
console.log( err );
}else{
response = {
message:'File uploaded successfully',
filename:req.files[0].originalname
};
}
console.log( response );
res.end( JSON.stringify( response ) );
});
});
})
var server = app.listen(8088, function () {
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})
node test.js
应用实例,访问地址为 http://:::8088
上传成功后输出
{
fieldname: 'image',
originalname: '屏幕快照 2020-04-05 4.28.15.png',
encoding: '7bit',
mimetype: 'image/png',
destination: '/tmp/',
filename: 'db7a8c97ccb6f956597481812f0faf10',
path: '/tmp/db7a8c97ccb6f956597481812f0faf10',
size: 1244437
}
{
message: 'File uploaded successfully',
filename: '屏幕快照 2020-04-05 4.28.15.png'
}
浏览器输入http://127.0.0.1:8088/index.htm,运行效果
上传,会传到根目录下
7. Cookie 管理
- 例1
test.js
var express = require('express')
var cookieParser = require('cookie-parser')
var util = require('util');
var app = express()
app.use(cookieParser())
app.get('/', function(req, res) {
console.log("Cookies: " + util.inspect(req.cookies));
})
app.listen(8088)
node test.js
浏览器输入http://127.0.0.1:8088
终端输出
Cookies: [Object: null prototype] {}
8. RESTful
REST(Representational State Transfer) 表述性状态转移
是一种设计风格而不是标准。
由Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。
是一组架构约束条件和原则,满足这些约束条件和原则的应用程序或设计就是RESTful。
通常基于使用HTTP、URI、XML、HTML这些现有的广泛流行的协议和标准。
通常使用 JSON 数据格式。
基于 REST架构的 Web Services 即是 RESTful
由于轻量级以及通过 HTTP直接传输数据的特性, RESTful 已经成为最常见的替代方法。
可以使用各种语言(比如 Java 程序、Perl、Ruby、Python、PHP 和 Javascript[包括 Ajax])实现客户端。
以下为 REST 基本架构的四个方法:
1. GET
用于 获取数据。
2. POST
用于 添加数据。
3. PUT
用于 更新/添加数据。
4. DELETE
用于 删除数据。
》》》例1
首先,创建一个 json 数据资源文件 users.json
{
"user1" : {
"name" : "cx",
"password" : "iloveyou",
"profession" : "person",
"id": 1
},
"user2" : {
"name" : "zhouxingchi",
"password" : "zhuyin",
"profession" : "star",
"id": 2
},
"user3" : {
"name" : "liudehua",
"password" : "china",
"profession" : "star",
"id": 3
}
}
- 获取列表 GET
server.js(获取用户列表)
var express = require('express');
var app = express();
var fs = require("fs");
app.get('/listUsers', function (req, res) {
fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
console.log( data );
res.end( data );
});
})
var server = app.listen(8088, function () {
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})
node server.js (启动服务器,端口为8088)
输出
应用实例,访问地址为 http://:::8088
浏览器输入http://127.0.0.1:8088/listUsers,运行效果
- 添加 POST
修改server.js(添加用户)
var express = require('express');
var app = express();
var fs = require("fs");
// 添加的新用户数据
var user = {
"user4" : {
"name" : "zhourunfa",
"password" : "zhourunfa",
"profession" : "star",
"id": 4
}
}
app.get('/addUser', function (req, res) {
// 读取已存在的数据
fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
data = JSON.parse( data );
data["user4"] = user["user4"];
console.log( data );
res.end( JSON.stringify(data));
});
})
var server = app.listen(8088, function () {
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})
node server.js (启动服务器,端口为8088)
输出
应用实例,访问地址为 http://:::8088
浏览器输入http://127.0.0.1:8088/addUser,运行效果
- 获取指定用户 GET
修改server.js(创建 :id, 用于读取指定用户的详细信息)
var express = require('express');
var app = express();
var fs = require("fs");
app.get('/:id', function (req, res) {
// 首先我们读取已存在的用户
fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
data = JSON.parse( data );
var user = data["user" + req.params.id]
console.log( user );
res.end( JSON.stringify(user));
});
})
var server = app.listen(8088, function () {
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})
node server.js (启动服务器,端口为8088)
输出
应用实例,访问地址为 http://:::8088
浏览器输入http://127.0.0.1:8088/2,运行效果
- 删除 DELETE
修改server.js(删除用户)
var express = require('express');
var app = express();
var fs = require("fs");
var id = 2;
app.get('/deleteUser', function (req, res) {
// First read existing users.
fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
data = JSON.parse( data );
delete data["user" + id];
console.log( data );
res.end( JSON.stringify(data));
});
})
var server = app.listen(8088, function () {
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})
node server.js (启动服务器,端口为8088)
输出
应用实例,访问地址为 http://:::8088
浏览器输入http://127.0.0.1:8088/deleteUser,运行效果
网友评论