Express
Node 框架,提供了路由系统、渲染引擎、中间件(Express 团队维护的中间件们)
Node 是一个单线程事件驱动的执行环境。
-
Node 和 Express 的 通用异步回调协议:错误优先回调 - 一种广泛使用的编程模式,回调函数的第一个参数是错误值,而后续的参数包含成功数据
// 异步操作 fs.readFile('/foo.txt', function(err, data) { // 读取文件 if(err) { // 如果没有发生错误,err 即为 null/undefined console.log('Unknown Error'); return; } console.log(data); });
-
中间件函数通常接受三个参数:
(req, res, next) => {}
-
特殊中间件 - 错误处理中间件:
(err, req, res, next) => {}
1、初始化
除了 res.send,还有很多 其他响应方法,例如 res.json() 发送响应、res.end() 、res.sendfile() 发送文件
const express = require('express')
const app = express()
// 路由定义
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(3000, () => {
console.log(`Example app listening on port 3000`)
})
2、路由处理器 express.Router
-
特殊路由方法 app.all,可以在特定路径为响应任意 HTTP 方法时调用、加载中间件
app.all("/secret", (req, res, next) => { // 特定的字符串模式 console.log("访问私有文件 ..."); next(); });
-
提供一组路由处理器
// wiki.js 维基路由模块 - 向 Router 对象添加路由就像向之前为 app 对象添加路由一样 const express = require('express') const router = express.Router(); router.get("/", (req, res) => { res.send("维基首页"); }); router.get("/about", (req, res) => { res.send("关于此维基"); }); module.exports = router;
```js const wiki = require(“./wiki.js”); // 引入路由模块 app.use(“/wiki”, wiki); // 把 Router 添加到中间件处理路径中
3、中间件
中间件函数通常是对请求或响应执行某些操作,然后调用“栈”里的下一个函数(其他中间件、路由处理器)。
一般先调用中间件后设置路由,否则路由处理器将无法访问中间件的功能。
- 中间件函数 VS 路由处理回调 唯一区别:中间件函数有第三个参数
next
,在中间件不会结束请求周期时应调用这个next
const middleware = (req, res, next) => { next() }
app.use(middleware); // 为所有的路由和 HTTP 动词添加该函数
app.use("/someroute", middleware); // 为一个特定的路由添加该函数
app.get("/", middleware); // 为一个特定的 HTTP 动词和路由添加该函数
4、托管静态文件
中间件:express.static(root, [options]),是 express 提供的原生中间件之一
app.use(express.static("public")); // public 下的所有文件均可通过在根 URL 后直接添加文件名来访问
app.use(express.static("media"));
// 还可以为静态 URL 创建一个虚拟的前缀
app.use("/media", express.static("public")); // 这些文件将通过 '/media' 前缀调用
5、错误处理
用来处理错误的特殊中间件函数有四个参数(err, req, res, next)
,而不是之前的三个。
// 默认的错误处理中间件函数在中间件函数栈的末尾 - Express 内建了错误处理机制会兜底
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send("出错了!");
});
6、模版引擎(视图)
支持多个模版引擎: ejs模版引擎、Pug(原名 Jade)模版引擎、Handlebars模版引擎、Nunjucks模版引擎
- 在路由处理器函数中调用 render 来创建并发送 HTML 响应
app.set('view engine', 'ejs');
app.set('view engine', 'pug');
// 配置 Handlebars 视图引擎
const hbs = exphbs.create({ defaultLayout: 'main' });
app.engine('handlebars', hbs.engine);
app.set('view engine', 'handlebars');
// 配置 Nunjucks 视图引擎
nunjucks.configure('views', {
autoescape: true,
express: app
});
app.set('view engine', 'njk');
// 在路由处理器函数中调用 render
app.get("/", (req, res) => {
res.render("index", { title: "关于狗狗", message: "狗狗很牛!" });
});