理解 Node.js
● 是一个基于 Chrome V8 引擎的 JavaScript 运行时。
● 非阻塞、事件驱动、异步 I/O,适合高并发场景。
✅ 核心概念
● 事件循环 (Event Loop): Node.js 的异步机制。
● 模块系统: 使用 require() 引入模块,module.exports 导出模块。
● 文件系统 (fs): 处理文件读写。
● HTTP 模块: 构建 Web 服务器。
创建 HTTP 服务器
javascript
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello, World!\n');
});
server.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
Express
✅ 简洁易用: 代码结构简明,易于上手。
✅ 路由系统: 提供灵活的 URL 路由处理。
✅ 中间件机制: 通过中间件实现请求和响应的处理流程。
✅ 模板引擎: 支持 EJS、Pug、Handlebars 等模板引擎。
✅ 静态文件: 可以轻松托管 CSS、JS、图片等静态资源。
✅ 跨平台: 与各种数据库(MongoDB、MySQL 等)无缝集成。
- Express.js 环境配置
javascript
//初始化项目
npm init -y
//安装 Express.js
npm install express
2.Hello World 示例
创建 app.js 文件,编写以下代码:
java
const express = require('express');
const app = express();
// 定义根路由
app.get('/', (req, res) => {
res.send('Hello, Express.js!');
});
// 启动服务器,监听 3000 端口
app.listen(3000, () => {
console.log('Server running at http://localhost:3000');
});
运行项目:
node app.js
- 中间件 (Middleware)
中间件 是处理请求和响应的函数链,可以进行日志记录、身份验证、错误处理等。
javascript
// 日志中间件
app.use((req, res, next) => {
console.log(`${req.method} ${req.url}`);
next(); // 继续执行下一个中间件或路由
});
// 处理 JSON 请求
app.use(express.json());
// 处理表单数据
app.use(express.urlencoded({ extended: true }));
- 路由系统 (Routing)
使用 .get()、.post()、.put()、.delete() 处理不同请求方法:
javascript
// GET 请求
app.get('/users', (req, res) => {
res.send('获取所有用户');
});
// POST 请求
app.post('/users', (req, res) => {
res.send('创建新用户');
});
// 动态路由参数
app.get('/users/:id', (req, res) => {
const userId = req.params.id;
res.send(`获取用户 ID: ${userId}`);
});
// 查询参数 (?name=Alice)
app.get('/search', (req, res) => {
const name = req.query.name;
res.send(`搜索用户: ${name}`);
});
- 静态文件托管
使用 express.static() 提供静态资源服务,如 CSS、JS、图片等:
app.use(express.static('public')); // public 文件夹内的文件可直接访问 - Express.js 与 MongoDB 集成
安装 MongoDB 驱动 mongoose:
javascript
npm install mongoose
连接 MongoDB:
const mongoose = require('mongoose');
mongoose.connect('mongodb://127.0.0.1:27017/mydb', {
useNewUrlParser: true,
useUnifiedTopology: true
}).then(() => console.log('MongoDB 连接成功'))
.catch(err => console.error(err));
定义数据模型:
const User = mongoose.model('User', {
name: String,
age: Number
});
// 保存数据
app.post('/add-user', async (req, res) => {
const newUser = new User({
name: req.body.name,
age: req.body.age
});
await newUser.save();
res.send('用户已保存');
});
// 查询数据
app.get('/users', async (req, res) => {
const users = await User.find();
res.json(users);
});
- 错误处理 (Error Handling)
javascript
// 404 错误处理
app.use((req, res, next) => {
res.status(404).send('页面未找到');
});
// 通用错误处理
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('服务器内部错误');
});
- Express 项目结构建议
javascript
my-express-app
├── node_modules
├── public
│ ├── css
│ ├── images
│ └── js
├── routes
│ ├── users.js
│ └── index.js
├── views
│ ├── index.ejs
│ └── users.ejs
├── app.js
└── package.json
将路由拆分到 routes 文件夹,便于项目维护:
javascript
const express = require('express');
const router = express.Router();
router.get('/', (req, res) => {
res.send('用户列表');
});
module.exports = router;
app.js:
const express = require('express');
const app = express();
const userRoutes = require('./routes/users');
// 使用路由
app.use('/users', userRoutes);
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
- 启动与自动重启 (使用 nodemon)
javascript
//安装 nodemon:
npm install -g nodemon
//使用 nodemon 启动项目:
nodemon app.js