Express 教程
1.创建站点骨架
使用生成器
npm install express-generator -g
express --help
用法:express [选项] [目录]
选项:
--version 打印版本号
-e, --ejs 添加 ejs 引擎支持
--pug 添加 pug 引擎支持
--hbs 添加 handlebars 引擎支持
-H, --hogan 添加 hogan.js 引擎支持
-v, --view <engine> 添加 <engine> 视图引擎支持 (ejs|hbs|hjs|jade|pug|twig|vash) (默认为 jade)
-c, --css <engine> 添加 <engine> 样式表引擎支持 (less|stylus|compass|sass) (默认为纯 css)
--git 添加 .gitignore
-f, --force 对非空文件夹强制执行
-h, --help 打印帮助信息
可以直接运行 express 命令,将使用 Jade 视图引擎和纯 CSS 在当前目录中创建项目。(如果指定目录名,则在子目录中创建项目)。
还可以使用 --view
选择视图(模板)引擎,并且/或者使用 --css
选择 CSS 生成引擎。
不推荐用 --hogan、–ejs、–hbs 等参数选用模板引擎。请使用 --view(或 -v)。
视图引擎
Express 应用生成器支持多款流行的视图/模板引擎,包括 EJS
、Hbs
、Pug (Jade)
、Twig
和 Vash
,缺省选项是 Jade
。
CSS 引擎
Express 应用生成器支持最常见的 CSS 引擎:LESS
, SASS
, Compass
, Stylus
。
2.创建项目
mkdir express-locallibrary-tutorial
cd express-locallibrary-tutorial
pxperss --view=pug
npm install
DEBUG=express-locallibrary-tutorial:* npm start
// 拼接路径
var path = require("path");
console.log(__dirname); // D:\project\express-locallibrary-tutorial
path.join(__dirname, "public"); // D:\project\express-locallibrary-tutorial\public
依赖包
cookie-parser:用于解析 cookie 头来填充 req.cookies(提供了访问 cookie 信息的便捷方法)。
debug:一个小型 node 调试程序,仿照 node 核心的调试技术建立。
http-errors:处理错误中间件。
morgan:node 专用 HTTP 请求记录器中间件。
nodemon: 文件改动时自动重启服务器
path: 用于解析文件和目录的核心 node 库
记录访问日志
// 记录访问日志
var logger = require("morgan");
app.use(logger("dev"));
文件改动时重启服务器
npm install --save-dev nodemon
// 使用 npm run devstart 启动后,编辑项目中的任何文件,服务器将自动重启(或者可以随时使用 rs 命令来重启)。查看更新后的页面需要点击浏览器的“刷新”按钮。
"scripts": {
"devstart": "nodemon ./bin/www" // 添加
},
路由
// /routes/users.js
var express = require("express");
var router = express.Router();
/* GET users listing. */
// 在检测到正确模式的 HTTP `GET` 请求时将调用该回调
// 第三个参数 'next',因此它是一个中间件函数,而不是简单的路由回调。next 参数暂时还用不到,在 '/' 路径中添加多个路由处理器时才会涉及。
router.get("/", function (req, res, next) {
res.send("respond with a resource");
});
module.exports = router;
// app.js
var usersRouter = require("./routes/users");
// 在收到 /users/ URL 时使用此路由
app.use("/users", usersRouter);
路由路径
路由路径也可以是字符串模式(String Pattern)。可用部分正则表达式语法来定义端点的模式。以下是所涉及的正则表达式(注意,连字符(-
)和点(.
)在字符串路径中解释为字面量,不能做为正则表达式):
?
:问号之前的一个字符只能出现零次或一次。例如,路由路径'/ab?cd
’ 路径匹配端点acd
或abcd
。+
:加号之前的一个字符至少出现一次。例如,路径路径'/ab+cd'
匹配端点abcd
、abbcd
、abbbcd
,等。*
:星号可以替换为任意字符串。例如,路由路径'/ab*cd'
匹配端点abcd
、abXcd
、abSOMErandomTEXTcd
,等。()
:将一个字符串视为一体以执行?
、+
、*
操作。例如。'/ab(cd)?e'
将对(cd)
进行匹配,将匹配到abe
和abcde
。
路由路径也可以是 JavaScript 正则表达式。例如,下面的路由路径将匹配 catfish
和 dogfish
,但不会匹配 catflap
、catfishhead
等。注意,正则表达式路径不再用引号 "..."
括起来,而是正则表达式语法 /.../
。
app.get(/.*fish$/, (req, res) => {
...
});
路由参数
路径参数是命名的 URL 段,用于捕获在 URL 中的位置指定的值。命名段以冒号为前缀,然后是名称(例如 /:your_parameter_name/。捕获的值保存在 req.params 对象中,键即参数名(例如 req.params.your_parameter_name)。
举例说,一个包含用户和藏书信息的 URL:http://localhost:3000/users/34/books/8989,可以这样提取信息(使用 userId 和 bookId 路径参数):
app.get("/users/:userId/books/:bookId", (req, res) => {
// 通过 req.params.userId 访问 userId
// 通过 req.params.bookId 访问 bookId
res.send(req.params);
});
路由参数名必须由“单词字符”(/[A-Za-z0-9_]/)组成。
重定向
router.get("/", function (req, res, next) {
res.redirect("/catalog"); // 重定向
});