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: 'john@example.com' })
})
.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 服务器的应用能力。

相关推荐
Mr_Mao1 小时前
Naive Ultra:中后台 Naive UI 增强组件库
前端
前端小趴菜053 小时前
React-React.memo-props比较机制
前端·javascript·react.js
摸鱼仙人~4 小时前
styled-components:现代React样式解决方案
前端·react.js·前端框架
sasaraku.4 小时前
serviceWorker缓存资源
前端
RadiumAg6 小时前
记一道有趣的面试题
前端·javascript
yangzhi_emo6 小时前
ES6笔记2
开发语言·前端·javascript
yanlele6 小时前
我用爬虫抓取了 25 年 5 月掘金热门面试文章
前端·javascript·面试
ai小鬼头6 小时前
Ollama+OpenWeb最新版0.42+0.3.35一键安装教程,轻松搞定AI模型部署
后端·架构·github
萧曵 丶7 小时前
Rust 所有权系统:深入浅出指南
开发语言·后端·rust
中微子7 小时前
React状态管理最佳实践
前端