Nodejs Express4 入门实战笔记01

本文含有: Express 安装 全局变量 环境变量.env 热加载 pm2 修改静态目录

本系列的目标快速上手 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 }));
Licensed under CC BY-NC-SA 4.0
本博客已稳定运行
发表了53篇文章 · 总计28.17k字
使用 Hugo 构建
主题 StackJimmy 设计