Express 介绍
- Express 是一个基于 Node.js 平台,快速、开放、极简的 web 开发框架
- Express 是一个第三方模块,有丰富的 API 支持,强大而灵活的中间件特性
- Express 不对 Node.js 已有的特性进行二次抽象,只是在它之上扩展了 Web 应用所需的基本功能
- 链接
Hello World
1 2
| npm init -y npm i express
|
1 2 3 4 5 6 7 8 9 10 11 12
| const express = require("express");
const app = express();
app.get("/", (req, res) => { res.send("hello world"); });
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
| const express = require("express");
const app = express();
app.use(express.static("public"));
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 2 3 4 5 6 7 8 9 10
| const bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({ extended: false }));
app.post("/add", function (req, res) { res.json(req.body); });
|
文件上传
如果 post 涉及文件上传操作,则会要额外使用multer
这个包来获取上传的信息。
1 2 3 4 5 6 7 8 9 10
| const multer = require("multer");
const upload = multer({ dest: "uploads/" });
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() { fs.readFile("mime.json", function (err, data) { return data; }); } 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()); });
|