Node.js攻略
字数 1415 2025-08-24 07:48:09
Node.js 全面指南
1. Node.js 基础
1.1 Node.js 简介
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,发布于 2009 年。它使 JavaScript 能够脱离浏览器运行在服务器端。
与 Java 的关系:Node.js 和 Java 的关系就像"雷锋塔"与"雷峰"的关系——名称相似但本质不同。
1.2 JavaScript 基础
浏览器端的 JavaScript:
- 负责浏览器端执行的脚本
- 在 HTML 中负责动态事件响应等功能
- 基本语法示例:
<script>alert('1')</script>
浏览器端 JS 应用:
- DOM 操作
- 事件监听(点击、滑动、双击等)
- 异步请求
JS 安全限制:
- 无法调用操作系统 API
- 无法访问文件系统
- Cookie 操作受限(HttpOnly 防止钓鱼)
2. Node.js 核心模块
2.1 文件系统模块 (fs)
读取文件:
const fs = require('fs');
fs.readFile('./file/1.txt', 'utf8', function(err, dataStr) {
if (err) {
return console.log('读取文件失败' + err.message);
}
console.log('读取文件成功' + dataStr);
});
写入文件:
fs.writeFile('f:/files/2.txt', 'abcd', function(err) {
if (err) {
return console.log('文件写入失败! ' + err.message);
}
console.log('文件写入成功!');
});
路径处理:
- 使用
__dirname获取当前目录绝对路径 - 避免使用相对路径(
./或../)
2.2 路径模块 (path)
常用方法:
const path = require('path');
// 路径拼接
path.join('/Users/john', 'Desktop', 'file.txt');
// 获取文件名
path.basename('/Users/john/Desktop/file.txt'); // 'file.txt'
// 获取扩展名
path.extname('/Users/john/Desktop/file.txt'); // '.txt'
3. HTTP 模块
3.1 创建 Web 服务器
const http = require('http');
const server = http.createServer();
server.on('request', (req, res) => {
res.setHeader('Content-Type', 'text/html;charset=utf-8');
res.end('Hello World');
});
server.listen(80, () => {
console.log('http server running at http://127.0.0.1');
});
3.2 请求与响应处理
请求对象 (req):
req.url- 请求的 URLreq.method- 请求方法 (GET/POST等)
响应对象 (res):
res.end()- 结束响应res.setHeader()- 设置响应头res.write()- 写入响应内容
4. Express 框架
4.1 基本使用
const express = require('express');
const app = express();
// GET 请求
app.get('/', (req, res) => {
res.send('Hello World!');
});
// POST 请求
app.post('/', (req, res) => {
res.send('Got a POST request');
});
app.listen(80, () => {
console.log('http://127.0.0.1');
});
4.2 路由处理
基本路由:
app.get('/users/:id', (req, res) => {
const userId = req.params.id;
res.send('User ID: ' + userId);
});
查询参数:
app.get('/user', (req, res) => {
const name = req.query.name;
const age = req.query.age;
res.send(`Hello, ${name}! You are ${age} years old.`);
});
4.3 静态资源托管
// 托管单个目录
app.use(express.static('public'));
// 托管多个目录
app.use(express.static('public'));
app.use(express.static('images'));
// 挂载路径前缀
app.use('/static', express.static('public'));
5. 模块系统
5.1 模块类型
-
核心模块:Node.js 内置模块
const http = require('http'); const fs = require('fs'); -
文件模块:开发者自定义模块
// myModule.js module.exports = { add: function(x, y) { return x + y; } }; // 使用 const myModule = require('./myModule'); -
第三方模块:通过 npm 安装
const _ = require('lodash');
5.2 模块化路由
创建路由模块:
// userRouter.js
const express = require('express');
const router = express.Router();
router.get('/users', (req, res) => {
res.send('User list');
});
module.exports = router;
使用路由模块:
const userRouter = require('./userRouter');
app.use('/api', userRouter);
6. 中间件
6.1 应用级别中间件
app.use((req, res, next) => {
console.log('Time:', Date.now());
next();
});
6.2 路由级别中间件
const router = express.Router();
router.use('/users', (req, res, next) => {
if (req.session.user) {
next();
} else {
res.status(401).send('Unauthorized');
}
});
7. 接口开发
7.1 RESTful API
GET 接口:
apiRouter.get('/get', (req, res) => {
res.send({
status: 0,
msg: 'GET 请求成功!',
data: req.query
});
});
POST 接口:
apiRouter.post('/post', (req, res) => {
res.send({
status: 0,
msg: 'POST 请求成功!',
data: req.body
});
});
7.2 跨域处理
CORS:
// 设置响应头允许跨域
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
JSONP(仅限GET):
// 服务器端
app.get('/api/data', (req, res) => {
const callback = req.query.callback;
const data = {name: 'John', age: 30};
res.send(`${callback}(${JSON.stringify(data)})`);
});
// 客户端jQuery调用
$.ajax({
url: "http://example.com/api/data",
dataType: "jsonp",
jsonp: "callback",
success: function(response) {
// 处理响应
}
});
8. 开发工具
8.1 nodemon
自动重启Node.js应用:
nodemon app.js
9. 安全相关
9.1 原型污染
JavaScript 原型污染是一种安全漏洞,利用了 JavaScript 对象的原型继承机制:
// 在Object.prototype上添加属性
Object.prototype.isAdmin = true;
// 所有对象都会继承这个属性
var obj = {};
console.log(obj.isAdmin); // true
// 恶意脚本可能修改原型
var maliciousScript = "<script>Object.prototype.isAdmin = false;</script>";
防范措施:
- 避免从不可信源加载脚本
- 使用
Object.freeze()冻结原型 - 对用户输入进行严格验证
9.2 文件系统安全
- 避免使用用户提供的路径直接访问文件
- 使用
path.join()和path.normalize()处理路径 - 设置适当的文件权限
10. 模板引擎
常用模板引擎:
- Pug (旧版叫 Jade)
- Mustache
- EJS
模板语法示例:
// Jade
#{username}
// EJS
<%= username %>
11. 最佳实践
-
错误处理:
fs.readFile('./file.txt', 'utf8', (err, data) => { if (err) { console.error('读取文件失败:', err.message); return; } // 处理数据 }); -
异步编程:
- 使用 Promise/async-await 替代回调地狱
- 正确处理异步错误
-
性能优化:
- 使用流处理大文件
- 合理使用缓存
- 避免阻塞事件循环
-
代码组织:
- 模块化设计
- 遵循单一职责原则
- 使用中间件处理通用逻辑
-
安全实践:
- 验证所有用户输入
- 使用HTTPS
- 限制依赖权限
- 定期更新依赖
通过掌握这些核心概念和技术,您将能够构建高效、安全的Node.js应用程序。