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 - 请求的 URL
  • req.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 模块类型

  1. 核心模块:Node.js 内置模块

    const http = require('http');
    const fs = require('fs');
    
  2. 文件模块:开发者自定义模块

    // myModule.js
    module.exports = {
      add: function(x, y) { return x + y; }
    };
    
    // 使用
    const myModule = require('./myModule');
    
  3. 第三方模块:通过 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. 最佳实践

  1. 错误处理

    fs.readFile('./file.txt', 'utf8', (err, data) => {
      if (err) {
        console.error('读取文件失败:', err.message);
        return;
      }
      // 处理数据
    });
    
  2. 异步编程

    • 使用 Promise/async-await 替代回调地狱
    • 正确处理异步错误
  3. 性能优化

    • 使用流处理大文件
    • 合理使用缓存
    • 避免阻塞事件循环
  4. 代码组织

    • 模块化设计
    • 遵循单一职责原则
    • 使用中间件处理通用逻辑
  5. 安全实践

    • 验证所有用户输入
    • 使用HTTPS
    • 限制依赖权限
    • 定期更新依赖

通过掌握这些核心概念和技术,您将能够构建高效、安全的Node.js应用程序。

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 中负责动态事件响应等功能 基本语法示例: 浏览器端 JS 应用: DOM 操作 事件监听(点击、滑动、双击等) 异步请求 JS 安全限制: 无法调用操作系统 API 无法访问文件系统 Cookie 操作受限(HttpOnly 防止钓鱼) 2. Node.js 核心模块 2.1 文件系统模块 (fs) 读取文件 : 写入文件 : 路径处理 : 使用 __dirname 获取当前目录绝对路径 避免使用相对路径( ./ 或 ../ ) 2.2 路径模块 (path) 常用方法 : 3. HTTP 模块 3.1 创建 Web 服务器 3.2 请求与响应处理 请求对象 (req) : req.url - 请求的 URL req.method - 请求方法 (GET/POST等) 响应对象 (res) : res.end() - 结束响应 res.setHeader() - 设置响应头 res.write() - 写入响应内容 4. Express 框架 4.1 基本使用 4.2 路由处理 基本路由 : 查询参数 : 4.3 静态资源托管 5. 模块系统 5.1 模块类型 核心模块 :Node.js 内置模块 文件模块 :开发者自定义模块 第三方模块 :通过 npm 安装 5.2 模块化路由 创建路由模块 : 使用路由模块 : 6. 中间件 6.1 应用级别中间件 6.2 路由级别中间件 7. 接口开发 7.1 RESTful API GET 接口 : POST 接口 : 7.2 跨域处理 CORS : JSONP(仅限GET) : 8. 开发工具 8.1 nodemon 自动重启Node.js应用: 9. 安全相关 9.1 原型污染 JavaScript 原型污染是一种安全漏洞,利用了 JavaScript 对象的原型继承机制: 防范措施: 避免从不可信源加载脚本 使用 Object.freeze() 冻结原型 对用户输入进行严格验证 9.2 文件系统安全 避免使用用户提供的路径直接访问文件 使用 path.join() 和 path.normalize() 处理路径 设置适当的文件权限 10. 模板引擎 常用模板引擎: Pug (旧版叫 Jade) Mustache EJS 模板语法示例: 11. 最佳实践 错误处理 : 异步编程 : 使用 Promise/async-await 替代回调地狱 正确处理异步错误 性能优化 : 使用流处理大文件 合理使用缓存 避免阻塞事件循环 代码组织 : 模块化设计 遵循单一职责原则 使用中间件处理通用逻辑 安全实践 : 验证所有用户输入 使用HTTPS 限制依赖权限 定期更新依赖 通过掌握这些核心概念和技术,您将能够构建高效、安全的Node.js应用程序。