Node.js 后端开发指南
目录
基础入门
环境搭建
bash
# 安装 Node.js
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
nvm install node
# 验证安装
node --version
npm --version包管理
bash
# 初始化项目
npm init
# 安装依赖
npm install express
npm install --save-dev nodemon
# 使用 yarn
yarn add express
yarn add -D nodemon模块系统
javascript
// CommonJS 模块
const express = require('express');
module.exports = {};
// ES 模块
import express from 'express';
export default {};Web 开发
Express 框架
javascript
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(3000, () => {
console.log('Server running on port 3000');
});Koa 框架
javascript
const Koa = require('koa');
const app = new Koa();
app.use(async ctx => {
ctx.body = 'Hello World';
});
app.listen(3000);NestJS 框架
typescript
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
}API 开发
RESTful API
javascript
// Express 实现 RESTful API
app.get('/api/users', (req, res) => {
// 获取用户列表
});
app.post('/api/users', (req, res) => {
// 创建用户
});
app.put('/api/users/:id', (req, res) => {
// 更新用户
});
app.delete('/api/users/:id', (req, res) => {
// 删除用户
});GraphQL
javascript
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 });WebSocket
javascript
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', function connection(ws) {
ws.on('message', function incoming(message) {
console.log('received: %s', message);
});
ws.send('something');
});数据库操作
MongoDB
javascript
const mongoose = require('mongoose');
const userSchema = new mongoose.Schema({
name: String,
email: String
});
const User = mongoose.model('User', userSchema);MySQL
javascript
const mysql = require('mysql2/promise');
const connection = await mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'password',
database: 'test'
});Redis
javascript
const Redis = require('ioredis');
const redis = new Redis();
await redis.set('key', 'value');
const value = await redis.get('key');性能优化
内存管理
javascript
// 使用流处理大文件
const fs = require('fs');
const readStream = fs.createReadStream('large-file.txt');
const writeStream = fs.createWriteStream('output.txt');
readStream.pipe(writeStream);并发处理
javascript
// 使用 Worker Threads
const { Worker, isMainThread, parentPort } = require('worker_threads');
if (isMainThread) {
const worker = new Worker(__filename);
worker.on('message', (msg) => console.log(msg));
} else {
parentPort.postMessage('Hello from worker!');
}缓存策略
javascript
// 使用 Redis 缓存
const cache = async (key, data) => {
await redis.set(key, JSON.stringify(data), 'EX', 3600);
};
const getCached = async (key) => {
const data = await redis.get(key);
return data ? JSON.parse(data) : null;
};部署运维
Docker 部署
dockerfile
FROM node:16-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]PM2 进程管理
bash
# 启动应用
pm2 start app.js
# 监控
pm2 monit
# 日志
pm2 logs监控告警
javascript
// 使用 Prometheus 监控
const prometheus = require('prom-client');
const counter = new prometheus.Counter({
name: 'http_requests_total',
help: 'Total number of HTTP requests'
});最佳实践
1. 项目结构
project/
├── src/
│ ├── controllers/
│ ├── models/
│ ├── services/
│ ├── routes/
│ └── utils/
├── tests/
├── config/
├── logs/
└── package.json2. 代码规范
- 使用 ESLint
- 使用 Prettier
- 遵循 Airbnb 规范
- 编写单元测试
3. 安全实践
- 使用 helmet
- 输入验证
- 错误处理
- 日志记录
学习资源
官方文档
视频课程
- 慕课网
- 极客时间
- B站技术区
- YouTube 技术频道