Express 生成器教程

1. Express.js 简介和特点

Express.js 是一个基于 Node.js 的快速、开放、极简的 Web 框架。它提供了构建 Web 应用程序和 API 所需的基本功能,同时保持了灵活性和可扩展性。Express.js 的特点包括:

  • 简单易用:Express.js 的 API 设计简洁,易于上手。
  • 灵活性:可以轻松集成各种中间件和第三方库。
  • 高性能:基于 Node.js,Express.js 具有高效的异步 I/O 处理能力。
  • 社区支持:拥有庞大的社区和丰富的文档资源。

2. 环境搭建 (Node.js, npm)

在开始使用 Express.js 之前,首先需要安装 Node.js 和 npm(Node Package Manager)。

2.1 安装 Node.js

访问 Node.js 官网,下载并安装适合你操作系统的 Node.js 版本。安装完成后,可以通过以下命令验证安装是否成功:

node -v
npm -v

2.2 初始化项目

创建一个新的项目目录,并在该目录下初始化 npm:

mkdir my-express-app
cd my-express-app
npm init -y

3. 创建第一个 Express.js 应用

3.1 安装 Express.js

使用 npm 安装 Express.js:

npm install express

3.2 创建基本应用

在项目根目录下创建一个 app.js 文件,并编写以下代码:

const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(port, () => {
  console.log(`App listening at http://localhost:${port}`);
});

3.3 运行应用

在终端中运行以下命令启动应用:

node app.js

打开浏览器,访问 http://localhost:3000,你应该会看到 "Hello World!" 的输出。

4. 路由基础

路由是指如何定义应用程序的端点(URI)以及如何响应客户端请求。

4.1 基本路由

app.get('/about', (req, res) => {
  res.send('About page');
});

app.post('/submit', (req, res) => {
  res.send('Form submitted');
});

4.2 路由参数

app.get('/user/:id', (req, res) => {
  res.send(`User ID: ${req.params.id}`);
});

5. 中间件概念

中间件是 Express.js 的核心概念之一。它是一个函数,可以访问请求对象(req)、响应对象(res)以及应用程序的请求-响应周期中的下一个中间件函数(next)。

5.1 使用中间件

app.use((req, res, next) => {
  console.log('Time:', Date.now());
  next();
});

5.2 自定义中间件

function logger(req, res, next) {
  console.log(`${req.method} ${req.url}`);
  next();
}

app.use(logger);

6. 请求和响应对象

6.1 请求对象 (req)

请求对象包含客户端请求的所有信息,如请求头、请求体、查询参数等。

app.get('/search', (req, res) => {
  const query = req.query.q;
  res.send(`Search query: ${query}`);
});

6.2 响应对象 (res)

响应对象用于向客户端发送响应。

app.get('/data', (req, res) => {
  res.json({ message: 'Hello from server' });
});

7. 路由进阶 (参数, 查询字符串)

7.1 路由参数

app.get('/user/:id', (req, res) => {
  res.send(`User ID: ${req.params.id}`);
});

7.2 查询字符串

app.get('/search', (req, res) => {
  const query = req.query.q;
  res.send(`Search query: ${query}`);
});

8. 静态文件服务

Express.js 提供了内置的中间件来处理静态文件。

app.use(express.static('public'));

9. 模板引擎 (EJS, Pug)

9.1 安装 EJS

npm install ejs

9.2 配置 EJS

app.set('view engine', 'ejs');

app.get('/', (req, res) => {
  res.render('index', { title: 'My Express App' });
});

10. 错误处理

10.1 基本错误处理

app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});

11. 常用中间件介绍

11.1 body-parser

用于解析请求体。

npm install body-parser
const bodyParser = require('body-parser');
app.use(bodyParser.json());

12. 自定义中间件开发

function authMiddleware(req, res, next) {
  if (req.headers.authorization === 'secret') {
    next();
  } else {
    res.status(403).send('Forbidden');
  }
}

app.use(authMiddleware);

13. 第三方中间件集成

13.1 helmet

用于增强应用的安全性。

npm install helmet
const helmet = require('helmet');
app.use(helmet());

14. 身份认证中间件

14.1 passport

用于处理用户认证。

npm install passport
const passport = require('passport');
app.use(passport.initialize());

15. 文件上传处理

15.1 multer

用于处理文件上传。

npm install multer
const multer = require('multer');
const upload = multer({ dest: 'uploads/' });

app.post('/upload', upload.single('file'), (req, res) => {
  res.send('File uploaded');
});

16. MongoDB 与 Mongoose

16.1 安装 Mongoose

npm install mongoose

16.2 连接 MongoDB

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true });

17. SQL 数据库 (MySQL, PostgreSQL)

17.1 安装 mysql

npm install mysql

17.2 连接 MySQL

const mysql = require('mysql');
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'mydatabase'
});

connection.connect();

18. ORM 工具 (Sequelize)

18.1 安装 Sequelize

npm install sequelize

18.2 初始化 Sequelize

const { Sequelize } = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
  host: 'localhost',
  dialect: 'mysql'
});

19. 数据验证和安全性

19.1 使用 express-validator

npm install express-validator
const { body, validationResult } = require('express-validator');

app.post('/user', [
  body('email').isEmail(),
  body('password').isLength({ min: 5 })
], (req, res) => {
  const errors = validationResult(req);
  if (!errors.isEmpty()) {
    return res.status(400).json({ errors: errors.array() });
  }
  res.send('Validation passed');
});

20. RESTful 设计原则

RESTful API 设计原则包括:

  • 使用 HTTP 方法(GET, POST, PUT, DELETE)
  • 使用名词表示资源
  • 使用状态码表示操作结果

21. API 版本控制

21.1 版本控制策略

app.get('/v1/users', (req, res) => {
  res.send('Version 1 Users');
});

app.get('/v2/users', (req, res) => {
  res.send('Version 2 Users');
});

22. 数据序列化和反序列化

22.1 使用 JSON.stringify 和 JSON.parse

const data = { name: 'John', age: 30 };
const jsonString = JSON.stringify(data);
const parsedData = JSON.parse(jsonString);

23. API 文档生成 (Swagger)

23.1 安装 swagger-jsdoc 和 swagger-ui-express

npm install swagger-jsdoc swagger-ui-express

23.2 配置 Swagger

const swaggerJsDoc = require('swagger-jsdoc');
const swaggerUi = require('swagger-ui-express');

const swaggerOptions = {
  swaggerDefinition: {
    info: {
      title: 'API',
      version: '1.0.0'
    }
  },
  apis: ['app.js']
};

const swaggerDocs = swaggerJsDoc(swaggerOptions);
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocs));

24. 缓存策略

24.1 使用 express-cache-controller

npm install express-cache-controller
const cacheControl = require('express-cache-controller');

app.use(cacheControl({ maxAge: 3600 }));

25. 压缩和 GZIP

25.1 使用 compression

npm install compression
const compression = require('compression');
app.use(compression());

26. 安全最佳实践

26.1 使用 helmet

const helmet = require('helmet');
app.use(helmet());

27. 跨域资源共享 (CORS)

27.1 使用 cors

npm install cors
const cors = require('cors');
app.use(cors());

28. 负载均衡

28.1 使用 nginx

配置 nginx 进行负载均衡。

29. 单元测试 (Mocha, Chai)

29.1 安装 Mocha 和 Chai

npm install mocha chai

29.2 编写测试

const chai = require('chai');
const expect = chai.expect;

describe('Array', () => {
  it('should return -1 when the value is not present', () => {
    expect([1, 2, 3].indexOf(4)).to.equal(-1);
  });
});

30. 集成测试

30.1 使用 supertest

npm install supertest
const request = require('supertest');
const app = require('../app');

describe('GET /', () => {
  it('should return 200 OK', (done) => {
    request(app)
      .get('/')
      .expect(200, done);
  });
});

31. 性能测试

31.1 使用 loadtest

npm install -g loadtest
loadtest -n 1000 -c 100 http://localhost:3000/

32. 调试技巧

32.1 使用 node-inspector

npm install -g node-inspector
node-debug app.js

33. 日志管理

33.1 使用 morgan

npm install morgan
const morgan = require('morgan');
app.use(morgan('combined'));

34. 部署到云平台 (Heroku, AWS)

34.1 部署到 Heroku

heroku create
git push heroku master

34.2 部署到 AWS

使用 AWS Elastic Beanstalk 或 EC2 进行部署。

35. 容器化 (Docker)

35.1 创建 Dockerfile

FROM node:14
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
CMD ["node", "app.js"]

35.2 构建和运行容器

docker build -t my-express-app .
docker run -p 3000:3000 my-express-app

36. 进程管理 (PM2)

36.1 安装 PM2

npm install -g pm2

36.2 启动应用

pm2 start app.js

37. 监控和日志

37.1 使用 PM2 监控

pm2 monit

38. CI/CD 流程

38.1 使用 GitHub Actions

创建 .github/workflows/ci.yml 文件:

name: CI
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Use Node.js
      uses: actions/setup-node@v2
      with:
        node-version: '14'
    - run: npm install
    - run: npm test

39. WebSocket 集成

39.1 使用 socket.io

npm install socket.io
const http = require('http');
const server = http.createServer(app);
const io = require('socket.io')(server);

io.on('connection', (socket) => {
  console.log('a user connected');
});

40. GraphQL 与 Express

40.1 使用 apollo-server-express

npm install apollo-server-express graphql
const { ApolloServer, gql } = require('apollo-server-express');

const typeDefs = gql`
  type Query {
    hello: String
  }
`;

const resolvers = {
  Query: {
    hello: () => 'Hello world!',
  },
};

const server = new ApolloServer({ typeDefs, resolvers });
server.applyMiddleware({ app });

41. 微服务架构

41.1 使用 seneca

npm install seneca
const seneca = require('seneca')();

seneca.add('role:math,cmd:sum', (msg, respond) => {
  respond(null, { answer: msg.left + msg.right });
});