Node.js Web服务器开发实战:从基础到数据库集成

1. 引言

Web 服务器是互联网的基石,它负责处理客户端的请求,并返回相应的资源或数据。本文将介绍 Web 服务器的基本概念、关键组件以及如何开发一个简单的 Web 服务器。

2. Web 服务器概述

Web 服务器的主要职责包括:

  • 监听客户端请求(通常是 HTTP/HTTPS 请求)。
  • 解析请求并处理相应的逻辑。
  • 访问服务器上的资源或数据库。
  • 生成响应并返回给客户端。

常见的 Web 服务器有 Nginx、Apache、Tomcat,以及一些轻量级服务器如 Express(Node.js)和 Flask(Python)。

3. Web 服务器关键组件

3.1 服务器架构

Web 服务器通常采用 C/S(Client-Server)架构,主要包含以下组件:

  • 监听端口:服务器通常监听 80(HTTP)或 443(HTTPS)端口。
  • 请求解析器:解析客户端的 HTTP 请求,包括方法、URL、Headers 等。
  • 路由处理器:根据请求的路径,调用相应的业务逻辑。
  • 响应生成器:根据请求结果,返回 HTML、JSON 或其他格式的数据。
  • 中间件(可选):用于身份验证、日志记录、缓存等。

3.2 HTTP 协议基础

HTTP(HyperText Transfer Protocol)是 Web 服务器与客户端通信的基础协议,包括:

  • 请求方法:GET、POST、PUT、DELETE、PATCH 等。
  • 状态码:如 200(成功)、404(未找到)、500(服务器错误)。
  • 头部信息(Headers) :用于传输元信息,如 Content-TypeAuthorization
  • 消息体(Body) :POST/PUT 请求可能包含请求数据,如 JSON、XML。

4. 使用 Node.js 开发简单的 Web 服务器

接下来,我们使用 Node.js 内置的 http 模块开发一个简单的 Web 服务器。

ini 复制代码
const http = require('http');
const PORT = 3000;

const server = http.createServer((req, res) => {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello, World!');
});

server.listen(PORT, () => {
    console.log(`Server running at http://localhost:${PORT}/`);
});

5. 进阶优化

5.1 读写文件

使用 fs 模块可以在服务器上读写文件。

读取文件

javascript 复制代码
const fs = require('fs');
fs.readFile('data.txt', 'utf8', (err, data) => {
    if (err) {
        console.error('Error reading file:', err);
        return;
    }
    console.log('File content:', data);
});

写入文件

javascript 复制代码
fs.writeFile('output.txt', 'Hello, Web Server!', (err) => {
    if (err) {
        console.error('Error writing file:', err);
        return;
    }
    console.log('File written successfully');
});

5.2 连接数据库

可以使用 mysql2mongoose 连接 MySQL 或 MongoDB 数据库。

连接 MySQL

php 复制代码
const mysql = require('mysql2');
const connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'password',
    database: 'test_db'
});

connection.connect(err => {
    if (err) {
        console.error('Database connection failed:', err);
        return;
    }
    console.log('Connected to MySQL database');
});

查询数据

javascript 复制代码
connection.query('SELECT * FROM users', (err, results) => {
    if (err) {
        console.error('Query error:', err);
        return;
    }
    console.log('User data:', results);
});

连接 MongoDB

javascript 复制代码
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/test_db', { useNewUrlParser: true, useUnifiedTopology: true })
    .then(() => console.log('Connected to MongoDB'))
    .catch(err => console.error('MongoDB connection error:', err));

5.3 从前端请求到写入数据库的完整示例

1. 前端代码(发送请求)

javascript 复制代码
fetch('http://localhost:3000/api/users', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json'
    },
    body: JSON.stringify({ name: 'John Doe', email: '[email protected]' })
})
.then(response => response.json())
.then(data => console.log('Success:', data))
.catch(error => console.error('Error:', error));

2. 后端代码(Express 处理请求并存入数据库)

php 复制代码
const express = require('express');
const mysql = require('mysql2');
const bodyParser = require('body-parser');
const session = require('express-session');

const app = express();
app.use(bodyParser.json());
app.use(session({
    secret: 'mySecretKey',
    resave: false,
    saveUninitialized: true,
    cookie: { secure: false }
}));

const connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'password',
    database: 'test_db'
});

connection.connect(err => {
    if (err) {
        console.error('Database connection failed:', err);
        return;
    }
    console.log('Connected to MySQL database');
});

app.post('/api/users', (req, res) => {
    const { name, email } = req.body;
    req.session.user = { name, email };
    connection.query('INSERT INTO users (name, email) VALUES (?, ?)', [name, email], (err, result) => {
        if (err) {
            res.status(500).json({ error: 'Database insert failed' });
            return;
        }
        res.json({ message: 'User added successfully', id: result.insertId, session: req.session.user });
    });
});

app.get('/api/session', (req, res) => {
    if (req.session.user) {
        res.json({ sessionData: req.session.user });
    } else {
        res.json({ message: 'No active session' });
    }
});

app.listen(3000, () => {
    console.log('Server running on http://localhost:3000');
});

6. 总结

本文介绍了 Web 服务器的基础知识,包括其主要功能、关键组件,以及如何使用 Node.js 构建一个简单的 Web 服务器。同时,我们扩展了 Web 服务器的功能,涵盖了文件读写、数据库连接,并提供了一个完整的前后端交互示例,以及会话控制功能,进一步提升 Web 服务器的应用能力。

相关推荐
程序员与背包客_CoderZ9 分钟前
Node.js异步编程——Callback回调函数实现
前端·javascript·node.js·web
Asus.Blogs13 分钟前
为什么go语言中返回的指针类型,不需要用*取值(解引用),就可以直接赋值呢?
开发语言·后端·golang
C_V_Better22 分钟前
Java Spring Boot 控制器中处理用户数据详解
java·开发语言·spring boot·后端·spring
非凡ghost24 分钟前
Pale Moon:速度优化的Firefox定制浏览器
前端·firefox
胡子洲27 分钟前
Spring Boot 应用中实现基本的 SSE 功能
java·spring boot·后端
清灵xmf40 分钟前
从 Set、Map 到 WeakSet、WeakMap 的进阶之旅
前端·javascript·set·map·weakset·weakmap
贰拾wan1 小时前
【Java-EE进阶】SpringBoot针对某个IP限流问题
java·spring boot·后端·idea
11054654011 小时前
11、参数化三维产品设计组件 - /设计与仿真组件/parametric-3d-product-design
前端·3d
Paran-ia1 小时前
【2025版】Spring Boot面试题
java·spring boot·后端
爱笑的林羽1 小时前
Mac M系列 安装 jadx-gui
前端·macos