本系列的目标快速上手 Express 框架, 基于官方文档归纳
参考中文文档:https://nodejs.cn/express/4x/api/
项目: https://github.com/eezd/cli-template/tree/main/nodejs-express-template
环境: Express 4.16
安装
我推荐使用这种方式快速创建项目, 可以节省你大量时间
npm install express-generator -g
express --view=pug myapp
cd myapp
pnpm i
pnpm start
Open: 127.0.0.1:3000
.env
如果需要使用环境变量我推荐安装 dotenv
模块
npm i dotenv
然后打开 app.js
文件,添加一行这个就可以启用了
require("dotenv").config();
// process.env.PORT
我们只需在根目录创建 .env
文件, 在里面写入
PORT = 8888
重新运行, 在访问 http://127.0.0.1:8888/
热加载
正常我们启动是运行 node ./bin/www
,每次改动代码就需要重新运行,这样过于麻烦了。
如果你想要每次保存就自动重启项目,或者说重新编译运行,只需要使用 nodemon
。
- 1、在根目录创建
nodemon.json
watch
: 监听目录ext
: 监听以下文件类型exec
: 运行命令ignore
: 忽略以下目录
{
"verbose": false,
"debug": false,
"watch": ["routes", "public", "views", "app.js"],
"ext": "js,pug,json",
"exec": "node ./bin/www",
"ignore": ["**/node_modules/**", "**/dist/**", "**/.git/**"],
"env": {
"NODE_ENV": "development"
}
}
- 2、
package.json
"scripts": {
"start": "node ./bin/www",
"dev": "npx nodemon"
},
重新运行 pnpm dev
就可以了
pm2
如果你服务是部署在 Linux(Debian) 上, 我更推荐使用
systemctl
部署
用于管理 Node.js 应用程序的进程管理器。它允许你以守护进程的形式运行 Node.js 应用,并提供了一系列功能,包括进程守护、自动重启、日志管理、负载均衡等。
- 1、
ecosystem.config.js
const { name } = require("./package.json");
const path = require("path");
module.exports = {
apps: [
{
name,
script: path.resolve(__dirname, "./bin/www"),
// instances: require('os').cpus().length,
instances: 2,
autorestart: true,
watch: true,
env_production: {
NODE_ENV: "production",
PORT: 10200,
},
},
],
};
- 2、
package.json
"scripts": {
"start": "node ./bin/www",
"dev": "npx nodemon",
"pm2": "pm2 restart ecosystem.config.js --env production"
},
app.js
本章节将对 express
以及 app
这两个方法进行说明,并且代码均保存在 app.js
文件中
var express = require("express");
var app = express();
公开静态目录
可以通过 http://127.0.0.1:8888/stylesheets/style.css
访问样式文件
app.use(express.static(path.join(__dirname, "public")));
同时可以设置前缀:http://127.0.0.1:8888/abc/stylesheets/style.css
app.use("/abc", express.static(path.join(__dirname, "public")));
全局/局部变量
app.locals
以及res.locals
都可以在res.render
呈现的模板中使用。
- 全局变量
app.locals
的范围是应用程序的整个生命周期,一般我们用于不同请求之间的数据传递。- 如果你想在请求中调用,则需要使用
req.app.locals
- 如果你想在请求中调用,则需要使用
app.locals.title = "My App";
console.dir(app.locals.title);
// => 'My App'
/* GET home page. */
router.get("/", function (req, res, next) {
console.log(req.app.locals.title);
res.render("index");
});
- 局部变量
res.locals
属性仅在请求的生命周期内有效,一般我们用于在res.render
呈现的模板中使用。
router.get("/", function (req, res, next) {
res.locals.name = "Tom";
res.render("index");
});
extends layout
block content
h1= title
p Welcome to #{title} // Welcome to My App
p Name #{name} // Name Tom
下面
express.json()
以及express.urlencoded()
强烈建议设置,如果你是跟我一样使用express-generator
则不用管,它自带的。
express.json()
这个也是一个必须要设置的中间件,专门解析表单中的 JSON
格式的数据。
默认情况下,如果不配置解析表单数据中间件,则 req.body
默认等于 undefined
app.use(express.json());
express.urlencoded()
这个也是一个必须要设置的中间件,专门解析 URL-encoded
格式的请求体数据。
app.use(express.urlencoded({ extended: false }));