Express 中文网:expressjs.com.cn
一、什么是 Express?
维基百科摘要:
Express.js或简称Express,是针对Node.js的web应用框架,在MIT许可证下作为自由及开放源代码软件发行。它设计用来建造web应用和API。它已经被称为针对Node.js的服务器框架的事实标准。
最初作者TJ Holowaychuk,将它描述为受Sinatra启发的服务器,意味着它是相对极小化的,带有以插件形式获得的很多特征。Express是MEAN软件栈的后端部件,其他部件是MongoDB数据库软件和AngularJS前端框架。
下面是个人对Expres的理解
- Express与Node的关系:
- Expres框架是后台的Node框架,其作用相当于JS的jQuery框架
- Express的哲学是在你的想法和服务器之间充当薄薄的一层。- 原生Node开发有那些问题?
- 呈现静态页面不方便,需要处理每个HTTP请求,还要考虑304问题
- 路由处理代码不直观清晰,需要写很多正则表达式和字符串函数
- 不能集中精力写业务,要考虑很多其它的东西如模块- Express整体感知
- 惊艳的路由能力,正则提取数据能力足够一般工作使用
- 静态文件处理能力,一句话解决
- 模板引擎的配合,直观清晰
二、快速搭建一个Express框架下的Node.js服务器
NPM 安装
//通常的安装模式都是使用npm,Node.js的安装方式据说不介绍了(官网下载下一步即可)
$ npm install express --save
// 安装完成后基本目录结构
.
├── app.js
├── node_modules
│ ├── ...
│ ├── express
│ └── ...
├── package-lock.json
└── package.json
$ node app.js 运行Node服务器
const express = require('express'); // express 模块引入
const app = express();
const port = 3000; // 设置端口号
app.get('/', (req, res) => res.send('Hello Express'));
app.listen(port); // 监听端口3000
浏览器访问 http://127.0.0.1:3000
三、Express 路由
学习路由使用前,可以先了解下 URL 字符串与 URL 对象
URL 字符串是结构化的字符串,包含多个含义不同的组成部分。 解析字符串后返回的 URL 对象,每个属性对应字符串的各个组成部分。
1)app.get(URL, callback) 接收GET数据
- 使用指定的回调函数将 HTTP GET请求路由到指定的路径。
- GET请求的参数在URL中,在原生Node中,GET请求需要使用
url
模块来识别参数字符串。在Express中,则不需要使用url
模块,可以直接使用req.query
对象
const express = require('express');
const app = express();
app.get('/', (req, res, next) => {
let GET = req.query; // 查询字符串 search
console.log(GET);
res.send("Hello Express");
});
app.listen(3000);
浏览器访问 http://127.0.0.1:3000/?username=“code”&userpwd=“123456”
终端:
2)app.post(“URL”,callback)
- 使用指定的回调函数将HTTP POST请求路由到指定的路径
- POST请求在Express中无法直接获取,必须使用
body-parser
模块。使用后,将可以用req.body
得到参数。如果表单中含有文件上传,则还需要使用formidable
模块。
const express = require('express');
const app = express();
let fs = require("fs");
const bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({ extended: false }));
app.get('/index', (req, res) => fs.readFile("./index.html", (err,data) => res.end(data))); // 读取表单页面
app.post('/insert', (req, res, next) => {
let POST = req.body
console.log(POST)
res.send("Hello Express");
})
app.listen(3000)
浏览器访问 http://127.0.0.1:3000/index
表单输入数据 请求为<form action="/insert" method="POST">
终端:
3)app.use()
- 也是一个中间件 与
get
、post
不同的是它的网址不是精确匹配的,use
能够无限拓展 - 不写路径的时候,实际上就相当于"/",即所有网址
let express = require("express");
let app = express();
// 指定一级路径
app.use("/public", (req, res) => {
// 'http://127.0.0.1:3000/public/xxx/new.html?user=json&age=12#1d=3'
res.write(req.originalUrl + "\n"); // 原始路径 '/public/xxx/new.html?user=json&age=12'
res.write(req.baseUrl + "\n"); // 一级路径 '/public'
res.write(req.path + "\n"); // 追加路径 '/xxx/ccc/new.html'
});
app.listen(3000);
4)app.use("/url", express.static("./fileName"));
- app.use(express.static()) 提供一个静态服务
app.use(express.static("./fileName"))
就是给我们增加一些特定功能的遍历场所- 不写详细路由,可直接访问到
static("./fileName")
fileName文件下的index.html
- 对路由拓展,可访问拓展路径下的文件(未指明详细文件则访问
index.html
),文件不存在则返回 Cannot …
let express = require("express");
let app = express();
app.use(express.static("./public"));
// app.use("/pub", express.static("./public"));
app.listen(3000);
5)Express 内容渲染
- 多数情况下,渲染内容用res.render(),将会根据views中的模板文件进行渲染,如果不想使用views文件夹,想自定义文件夹,则app.set(“views”, “xxx”)
- 快速测试网页,可以使用res.send(),这个函数会根据内容自动帮我们设置content-type头部和200状态码
- 想使用不同的状态码:res.status(404).send(“Sorry, We Cannot Find That !”);
- 想使用不同的content-type:res.set(“content-type”,“text/html”);