# Express 基础
Express 是对 node 进行一层封装,是一个简洁而灵活的 Nodejs web 应用框架。
npm install -g express-generator
express 脚手架
# express 能干啥
- 1,可以设置中间件来响应 HTTP 请求
- 2,定义了路由表用于执行不同的 HTTP 请求动作
- 3,可以通过向模板传递参数来动态渲染 HTML 页面
# express 常用模块安装
中间件通过 next 来中间件传递
- body-parser nodejs 中间件,用于处理 JSON, Raw, Text 和 URL 编码数据
- cookie-parser 解析 Cookie 的工具,通过 req.cookies 可以取到传来的 cookie,并把它转成对象
- multer nodejs 中间件,用于处理
enctype="multipart/form-data"
(设置表单的 MIME 编码)的表单数据
var express = require("express");
var app = express();
app.get("/", function(req, res) {
res.send("hello world");
});
// 启动服务
var server = app.listen(8081, function() {
var host = server.address().address;
var port = server.address().port;
console.log("应用实例,访问地址为http://%s:%s", host, port);
});
# 二,请求和响应的一些参数
# supervisor => 热启动
// supervisor app.js
app.get("/", function(req, res) {
// /?username="123"
res.send("qweqw" + req.query.username);
});
app.get("/:id", function(req, res) {
// 伪静态
res.send("hello" + req.params.id);
res.json({
id: res.params.id,
});
});
# request 和 response 对象的具体介绍:
# request 对象 (表示 HTTP 请求,包含请求查询字符串,参数,内容,HTTP 头部等属性)
- 1,req.app 当 callback 为外部文件时,用 req.app 访问 express 实例
- 2,req.baseUrl: 获取路由当前安装的 URL 路径
- 3,req.body / req.cookies: 获得[请求体] / 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 响应,即在接收到请求时向客户端送的 HTTP 响应数据)
- 1,res.app: 同上
- 2,app.append(): 追加指定 HTTP 头
- 3,res.set()在 res.append()后将重置之前的设置头
- 4,res.cookie(name,value[,option]): 设置 Cookie
- 5,opition: domain / expires / httpOnly / maxAge / path / secure / signed
- 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,[loacals],callback): 渲染一个 view 同时向 callback 传递渲染后的字符串,如果渲染过程中有错误发生 next(err)将会被自动调用。callback 将会被传入一个可能发生的错误以及渲染后的页面,这样就不会自动输出了。
- 14,res.send(): 传送 HTTP 响应
- 15,res.sendFeil(path[,options][,fn]): 传送指定路径文件 -会自动根据文件 extension 设定 Content-Type
- 16,res.set(): 设置 HTTP 头,传入 object 可以一次设置多个头
- 17,res.status(): 设置 HTTP 状态码
- 18,res.type(): 设置 Content-Type 的 MIME 类型
# 路由
RESTful
var express = require("express");
var app = express();
// 主页
app.get("/", function(req, res) {
res.send("Get Hello");
console.log("index 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 Get 请求");
res.send("删除页面");
});
// post 请求
app.post("/del_user", function(req, res) {
console.log("主页post请求");
res.send("Hellasdasdo post");
});
var server = app.listen(8081, function() {
// var host = server.address().address
// var port = server.address().port
console.log(213);
});
# 静态文件
var express = require("express");
var app = express();
// http://localhost:8081/css/index.css
// app.use 中间件 访问静态文件目录
app.use(express.static("public"));
app.get("/index.html", function(req, res) {
res.sendFile(__dirname + "/views/" + "index.html");
});
var server = app.listen(8081, function() {
var host = server.address().address;
var port = server.address().port;
console.log(host);
});
# GET 方法
// index.html
// <html>
// <style src="styleSheels/index.css"
// <body>
// <form action="http://192.168.1.166/process_get" method = "GET">
// First name: <input type="text" name = "first_name"><br/>
// last name: <input type="text" name = "last_name"><br/>
// <input type = "submit" value="Submit">
// </form>
// </body>
// </html>
// server.js
var express = require("express");
var app = express();
app.use(express.static("public"));
app.get("/index.html", function(req, res) {
res.sendFile(__dirname + "/views/" + "index.html");
});
var server = app.listen(8081, function() {
var host = server.address().address;
var port = server.address().port;
console.log("应用实例,访问地址为 http://%s:%s", host, port);
});
# POST 方法
<!-- index.html -->
<html>
<link rel="stylesheet" href="stylesheels/index.css" />
<body>
<form action="http://192.168.1.166:8081/process_post" method="POST">
First name: <input type="text" name="first_name" /><br />
last name: <input type="text" name="last_name" /><br />
<input type="submit" value="Submit" />
</form>
</body>
</html>
// app.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(express.static("public"));
app.get("/index.html", function(req, res) {
res.sendFile(__dirname + "/views/" + "index.html");
});
app.post("/process_post", urlencodedParser, function(req, res) {
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(8081, function() {
var host = server.address().address;
var port = server.address().port;
console.log("应用实例,访问地址为 http://%s:%s", host, port);
});
# 文件上传
<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>
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: __dirname + "/tmp/" }).array("image"));
app.get("/index.html", function(req, res) {
res.sendFile(__dirname + "/views/" + "index.html");
});
app.post("/file_upload", function(req, res) {
console.log(req.files[0]);
var des_file = __dirname + "/tmp/" + 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(8081, function() {
var host = server.address().address;
var port = server.address().host;
console.log("应用实例,访问地址为 http://%s:%s", host, port);
});
# cookie 管理
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(8081);
# express 中间件 next()
中间件(Middleware)是一个函数,可以访问请求对象(request object(req)
),响应对象(response object(res)
),和 web 应用处于请求-响应循环流程中的中间件,一般被命名为next
变量
- 执行任何代码
- 修改请求和响应对象
- 终结请求-响应循环
- 调用堆栈中的下一个中间件函数
# Express 应用可使用如下几个中间件
- 应用级中间件
- 路由级中间件
- 错误处理中间件
var router = express.router();
- 内置中间件
- 第三方中间件
var express = require("express");
var app = express();
app.get(
"/",
function(req, res, next) {
req.data = 123;
next();
},
(req, res) => {
console.log(req.data);
res.send("hi nn");
// res.end(""); // end就结束了
}
);
app.listen(8081);
# 错误处理
var express = require("express");
var cookieParser = require("cookie_parser");
var app = express();
// 获取cookie要前置
app.use(cookieParser());
// 前置处理
app.use(function(req, res, next) {
req.cookies = function() {
return {
data: "1223",
};
};
next();
aaaan;
});
app.get("/", function(req, res, next) {
res.send(req.cookies().data);
});
app.get("/index", function(req, res, next) {
console.log(req.cookies);
res.send("adfasdf");
});
// 放在后面兜错
app.use(function(err, req, res, next) {
console.log(err.stack);
res.status(500).send("something wrong");
});
app.listen(8081);