跳到主要内容

速查表

Express.js 常用语法和配置速查表。

基础设置

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

app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(express.static('public'));

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => console.log(`Server running on port ${PORT}`));

路由

app.get('/', handler);
app.post('/', handler);
app.put('/:id', handler);
app.patch('/:id', handler);
app.delete('/:id', handler);
app.all('/path', handler);

app.route('/users')
.get(getUsers)
.post(createUser);

const router = express.Router();
router.get('/', handler);
app.use('/api', router);

请求对象

req.params          // 路径参数 /users/:id
req.query // 查询参数 ?page=1
req.body // 请求体 (需要 express.json())
req.headers // 请求头
req.cookies // Cookies (需要 cookie-parser)
req.ip // 客户端 IP
req.method // HTTP 方法
req.path // 请求路径
req.get('Header') // 获取请求头

响应对象

res.send(data)                    // 发送响应
res.json(data) // JSON 响应
res.status(200).json(data) // 设置状态码
res.redirect('/path') // 重定向
res.download('/file.pdf') // 文件下载
res.sendFile('/path/file.html') // 发送文件
res.render('view', data) // 渲染模板
res.set('Header', 'value') // 设置响应头
res.cookie('name', 'value') // 设置 Cookie
res.clearCookie('name') // 清除 Cookie

中间件

app.use(middleware);              // 应用级中间件
app.use('/path', middleware); // 路径中间件
app.get('/path', middleware, handler); // 路由中间件

const middleware = (req, res, next) => {
next();
next(err);
};

错误处理

app.use((err, req, res, next) => {
res.status(500).json({ error: err.message });
});

next(new Error('Something went wrong'));

常用中间件

const helmet = require('helmet');
const cors = require('cors');
const morgan = require('morgan');
const rateLimit = require('express-rate-limit');

app.use(helmet());
app.use(cors());
app.use(morgan('dev'));

app.use(rateLimit({
windowMs: 15 * 60 * 1000,
max: 100
}));

JWT 认证

const jwt = require('jsonwebtoken');

const token = jwt.sign({ id: user.id }, secret, { expiresIn: '7d' });
const decoded = jwt.verify(token, secret);

const authMiddleware = (req, res, next) => {
const token = req.headers.authorization?.split(' ')[1];
if (!token) return res.status(401).json({ error: '未授权' });
try {
req.user = jwt.verify(token, secret);
next();
} catch (err) {
res.status(401).json({ error: 'Token 无效' });
}
};

Mongoose CRUD

const User = mongoose.model('User', schema);

await User.find();
await User.findById(id);
await User.findOne({ email });
await User.create(data);
await User.findByIdAndUpdate(id, data, { new: true });
await User.findByIdAndDelete(id);
await User.countDocuments();

文件上传

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

app.post('/upload', upload.single('file'), (req, res) => {
console.log(req.file);
});

app.post('/photos', upload.array('photos', 12), (req, res) => {
console.log(req.files);
});

测试

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

test('GET /users', async () => {
const res = await request(app).get('/users');
expect(res.status).toBe(200);
});

test('POST /users', async () => {
const res = await request(app)
.post('/users')
.send({ name: 'Test' });
expect(res.status).toBe(201);
});

PM2 命令

pm2 start app.js
pm2 start app.js -i max
pm2 stop all
pm2 restart all
pm2 logs
pm2 monit
pm2 save
pm2 startup

Docker 命令

docker build -t app .
docker run -p 3000:3000 app
docker-compose up -d
docker-compose logs -f
docker-compose down

环境变量

require('dotenv').config();

process.env.NODE_ENV
process.env.PORT
process.env.DATABASE_URL
process.env.JWT_SECRET

常用状态码

状态码描述
200OK
201Created
204No Content
400Bad Request
401Unauthorized
403Forbidden
404Not Found
500Internal Server Error