Express 介绍

  • Express 是一个基于 Node.js 平台,快速、开放、极简的 web 开发框架
  • Express 是一个第三方模块,有丰富的 API 支持,强大而灵活的中间件特性
  • Express 不对 Node.js 已有的特性进行二次抽象,只是在它之上扩展了 Web 应用所需的基本功能
  • 链接

Hello World

  • 下载 Express 包
1
2
npm init -y
npm i express
  • 代码
1
2
3
4
5
6
7
8
9
10
11
12
// 0. 加载 Express
const express = require("express");
// 1. 调用 express() 得到一个 app
// 类似于 http.createServer()
const app = express();
// 2. 设置请求对应的处理函数
// 当客户端以 GET 方法请求 / 的时候就会调用第二个参数:请求处理函数
app.get("/", (req, res) => {
res.send("hello world");
});
// 3. 监听端口号,启动 Web 服务
app.listen(3000, () => console.log("app listening on port 3000!"));

托管静态资源

产考文档

让用户直接访问静态资源是一个 web 服务器最基本的功能。

1
2
http://localhost:3000/1.png http://localhost:3000/css/style.css
http://localhost:3000/js/index.js

例如,如上 url 分别是请求一张图片,一份样式文件,一份 js 代码。我们实现的 web 服务器需要能够直接返回这些文件的内容给客户端浏览器。

忽略前缀

此时,所有放在 public 下的内容可以直接访问,注意,此时在 url 中并不需要出现 public 这级目录

  • 在 public 下新建 index.html。可以直接访问到。
1
2
3
4
5
6
7
8
9
10
11
12
// 0. 加载 Express
const express = require("express");

// 1. 调用 express() 得到一个 app
// 类似于 http.createServer()
const app = express();

// 2. 设置请求对应的处理函数
app.use(express.static("public"));

// 3. 监听端口号,启动 Web 服务
app.listen(3000, () => console.log("app listening on port 3000!"));

限制前缀

这意味着想要访问 public 下的内容,必须要在请求 url 中加上/public

1
2
// 限制访问前缀
app.use("/public", express.static("public"));

路由

产考文档

路由(Routing)是由一个 URL(或者叫路径标识)和一个特定的 HTTP 方法(GET、POST 等)组成的,涉及到应用如何处理响应客户端请求。每一个路由都可以有一个或者多个处理器函数,当匹配到路由时,这些个函数将被执行。

设置状态码

1
res.status(200).json({ name: "abc" });

Get

无参数

1
2
3
4
5
6
7
8
9
const express = require("express");
const app = express();
app.get("/get", function(req, res) {
// 直接返回对象
res.json({ name: "abc" });
});
app.listen("8088", () => {
console.log("8088");
});

有参数

express 框架会自动收集 get 参数,并保存在 req 对象的query属性中。我们直接来获取即可。

1
2
3
4
5
6
7
8
9
10
11
const express = require("express");
const app = express();
app.get("/get", function(req, res) {
// 直接返回对象
console.log(req.query);

res.send({ name: "abc" });
});
app.listen("8088", () => {
console.log("8088");
});

Post

无参数

1
2
3
4
5
6
7
const app = express();
app.post("/post", function(req, res) {
res.send({ name: "abc" });
});
app.listen("8088", () => {
console.log("8088");
});

普通键值对参数

获取 post 普通键值对数据,要通过第三方模块body-parser来解析。

1
npm install body-parser
1
2
3
4
5
6
7
8
9
10
// 1. 引入包
const bodyParser = require("body-parser");

// 2. 使用包
app.use(bodyParser.urlencoded({ extended: false }));

app.post("/add", function(req, res) {
//3. 可以通过req.body来获取post传递的键值对
res.json(req.body);
});

文件上传

如果 post 涉及文件上传操作,则会要额外使用multer这个包来获取上传的信息。

1
npm install multer
1
2
3
4
5
6
7
8
9
10
// 1. 引入包
const multer = require("multer");
// 2. 配置
const upload = multer({ dest: "uploads/" }); // 上传的文件会保存在这个目录下
// uploads表示一个目录名,你也可以设置成其它的

// 3. 使用
// 这个路由使用第二个参数 .upload.single表示单文件上传, 'cover' 表示要上传的文件在本次上次数据中的键名。类似于<input type="file" name='cover'/>

app.post("postfile", upload.single("cover"), function(req, res) {});

常见问题

node 中的异步问题

例如

1
2
3
4
5
6
7
8
9
10
11
var fs = require("fs");
function getMime() {
//1
fs.readFile("mime.json", function(err, data) {
//console.log(data.toString());
return data; //3
});
//2
//return '123';
}
console.log(getMime()); /*由于异步操作没有拿到数据,如何解决,通过异步操作*/

解决

1
2
3
4
5
6
7
8
9
var fs = require("fs");
function getMime(callback) {
fs.readFile("mime.json", function(err, data) {
callback(data);
});
}
getMime(function(result) {
console.log(result.toString());
});