常用插件与扩展库介绍
常用插件与扩展库介绍
Express作为Node.js最流行的Web框架之一,其强大之处在于丰富的中间件生态系统。通过插件和扩展库,开发者可以快速实现路由管理、模板渲染、数据库连接等功能,大幅提升开发效率。
中间件类插件
body-parser
处理HTTP请求体数据的中间件,支持JSON、URL编码和multipart格式:
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json()); // 解析JSON格式
app.use(bodyParser.urlencoded({ extended: true })); // 解析URL编码格式
app.post('/api/users', (req, res) => {
console.log(req.body); // 获取POST请求体数据
res.sendStatus(200);
});
morgan
HTTP请求日志记录器,支持多种日志格式:
const morgan = require('morgan');
app.use(morgan('combined')); // 使用标准Apache组合日志格式
// 其他格式包括dev、tiny、short等
helmet
安全防护中间件,自动设置HTTP安全头:
const helmet = require('helmet');
app.use(helmet()); // 默认启用所有安全中间件
// 可单独配置:app.use(helmet.contentSecurityPolicy());
模板引擎扩展
ejs
嵌入式JavaScript模板引擎:
app.set('view engine', 'ejs');
app.get('/', (req, res) => {
res.render('index', { title: 'EJS示例', items: ['a', 'b', 'c'] });
});
对应模板文件:
<!-- views/index.ejs -->
<h1><%= title %></h1>
<ul>
<% items.forEach(item => { %>
<li><%= item %></li>
<% }); %>
</ul>
pug
高性能模板引擎(原Jade):
app.set('view engine', 'pug');
app.get('/profile', (req, res) => {
res.render('profile', { user: { name: '张三', age: 28 } });
});
模板示例:
//- views/profile.pug
doctype html
html
body
h1= user.name
p 年龄: #{user.age}
数据库集成
mongoose
MongoDB对象建模工具:
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
const UserSchema = new mongoose.Schema({
name: String,
email: { type: String, unique: true }
});
const User = mongoose.model('User', UserSchema);
app.post('/users', async (req, res) => {
const user = new User(req.body);
await user.save();
res.json(user);
});
sequelize
支持多种SQL数据库的ORM:
const { Sequelize, Model, DataTypes } = require('sequelize');
const sequelize = new Sequelize('sqlite::memory:');
class User extends Model {}
User.init({
username: DataTypes.STRING,
birthday: DataTypes.DATE
}, { sequelize });
app.get('/users', async (req, res) => {
const users = await User.findAll();
res.json(users);
});
实用工具库
lodash
JavaScript实用工具库:
const _ = require('lodash');
app.get('/api/products', (req, res) => {
const rawProducts = getProductsFromDB(); // 假设返回数组
const filtered = _.filter(rawProducts, p => p.price > 100);
const sorted = _.sortBy(filtered, 'name');
res.json(_.take(sorted, 10));
});
moment
日期处理库(注意:已进入维护模式):
const moment = require('moment');
app.get('/events', (req, res) => {
const now = moment();
const events = getEvents().filter(e =>
moment(e.date).isBetween(now, now.clone().add(1, 'month'))
);
res.json(events);
});
测试相关
supertest
HTTP断言库:
const request = require('supertest');
const app = require('../app');
describe('GET /users', () => {
it('responds with JSON', done => {
request(app)
.get('/users')
.set('Accept', 'application/json')
.expect('Content-Type', /json/)
.expect(200, done);
});
});
jest
测试框架集成:
const { createServer } = require('../server');
let server;
beforeAll(() => { server = createServer(); });
afterAll(() => { server.close(); });
test('GET /ping returns pong', async () => {
const res = await request(server).get('/ping');
expect(res.statusCode).toBe(200);
expect(res.text).toBe('pong');
});
性能优化
compression
响应压缩中间件:
const compression = require('compression');
app.use(compression()); // 默认使用zlib压缩
// 可配置:app.use(compression({ level: 6 }));
express-rate-limit
API限流中间件:
const rateLimit = require('express-rate-limit');
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15分钟
max: 100 // 每个IP限制100次请求
});
app.use('/api/', limiter);
实时通信
socket.io
WebSocket实时通信库:
const http = require('http');
const socketio = require('socket.io');
const server = http.createServer(app);
const io = socketio(server);
io.on('connection', socket => {
console.log('新客户端连接');
socket.on('chat message', msg => {
io.emit('chat message', msg);
});
});
server.listen(3000);
文件处理
multer
文件上传中间件:
const multer = require('multer');
const upload = multer({ dest: 'uploads/' });
app.post('/upload', upload.single('avatar'), (req, res) => {
console.log(req.file); // 上传文件信息
res.send('上传成功');
});
sharp
高性能图像处理库:
const sharp = require('sharp');
app.get('/thumbnail', async (req, res) => {
const buffer = await sharp('input.jpg')
.resize(200, 200)
.toBuffer();
res.type('image/jpeg').send(buffer);
});
认证授权
passport
认证中间件:
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
passport.use(new LocalStrategy(
(username, password, done) => {
User.findOne({ username }, (err, user) => {
if (err) return done(err);
if (!user) return done(null, false);
if (!user.verifyPassword(password)) return done(null, false);
return done(null, user);
});
}
));
app.post('/login',
passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/login'
})
);
jsonwebtoken
JWT实现:
const jwt = require('jsonwebtoken');
app.post('/api/auth', (req, res) => {
const token = jwt.sign(
{ userId: 123 },
'your-secret-key',
{ expiresIn: '1h' }
);
res.json({ token });
});
开发工具
nodemon
开发热重载工具:
// package.json
{
"scripts": {
"dev": "nodemon server.js"
}
}
dotenv
环境变量管理:
require('dotenv').config();
app.get('/config', (req, res) => {
res.json({
dbHost: process.env.DB_HOST,
apiKey: process.env.API_KEY
});
});
部署相关
pm2
生产环境进程管理:
pm2 start server.js -i max --name "my-api"
pm2 save
pm2 startup
cors
跨域资源共享中间件:
const cors = require('cors');
app.use(cors()); // 允许所有跨域请求
// 可配置:app.use(cors({ origin: 'https://example.com' }));
本站部分内容来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn