22 创建基本的HTTP服务器

22 创建基本的HTTP服务器

在本节中,我们将学习如何使用Node.js创建一个简单的HTTP服务器。Node.js为构建高性能的网络应用程序提供了强大的功能,创建HTTP服务器是其基本应用之一。

环境准备

首先,请确保您的计算机上已经安装了Node.js。您可以通过以下命令检查是否成功安装:

1
node -v

如果输出了Node.js的版本号,说明安装成功。

创建HTTP服务器

  1. 创建一个新的文件

我们可以用任何文本编辑器来创建一个新的JavaScript文件。比如,我们创建一个文件名为server.js

  1. 引入HTTP模块

server.js文件中,我们需要引入Node.js内置的http模块,这是创建HTTP服务器的关键。

1
const http = require('http');
  1. 创建服务器

使用http.createServer()方法,我们可以创建一个HTTP服务器。在这个方法中,我们需要提供一个回调函数,该函数会在接收到请求时被调用。

1
2
3
4
5
const server = http.createServer((req, res) => {
res.statusCode = 200; // 设置HTTP状态码
res.setHeader('Content-Type', 'text/plain'); // 设置响应头
res.end('Hello, World!\n'); // 结束响应并发送数据
});
  1. 监听端口

接下来,我们使服务器开始监听特定的端口。通常使用3000端口。

1
2
3
4
const PORT = 3000;
server.listen(PORT, () => {
console.log(`Server running at http://localhost:${PORT}/`);
});
  1. 完整代码

下面是我们创建的一个基本HTTP服务器的完整代码:

1
2
3
4
5
6
7
8
9
10
11
12
const http = require('http');

const server = http.createServer((req, res) => {
res.statusCode = 200; // 设置HTTP状态码
res.setHeader('Content-Type', 'text/plain'); // 设置响应头
res.end('Hello, World!\n'); // 结束响应并发送数据
});

const PORT = 3000; // 监听端口
server.listen(PORT, () => {
console.log(`Server running at http://localhost:${PORT}/`);
});

运行服务器

在终端中,导航到包含server.js文件的目录,并运行以下命令启动服务器:

1
node server.js

如果一切正常,您应该能看到类似以下的输出:

1
Server running at http://localhost:3000/

测试服务器

打开您的浏览器,访问http://localhost:3000/,您将会看到页面上显示Hello, World!的消息。

您也可以使用命令行工具如curl来测试:

1
curl http://localhost:3000/

输出结果将是:

1
Hello, World!

总结

我们成功创建了一个基本的HTTP服务器,能够响应简单的Hello, World!消息。这个过程展示了Node.js的简单性和强大功能,为后续更复杂的网络应用程序打下了基础。在接下来的学习中,我们将探索更多的功能和特性。

23 Node.js 处理请求和响应

23 Node.js 处理请求和响应

Node.js 非常适合处理 HTTP 请求和响应。在本节中,我们将通过示例了解如何使用 Node.js 创建一个简单的 HTTP 服务器,并处理请求和响应。

创建基础 HTTP 服务器

首先,我们需要使用 Node.js 创建一个 HTTP 服务器。Node.js 的 http 模块提供了创建服务器所需的功能。

1
2
3
4
5
6
7
8
9
10
11
12
const http = require('http');

const server = http.createServer((req, res) => {
res.statusCode = 200; // 设置状态码为 200
res.setHeader('Content-Type', 'text/plain'); // 设置响应头
res.end('Hello, World!\n'); // 结束响应并发送数据
});

const PORT = 3000;
server.listen(PORT, () => {
console.log(`服务器正在运行,监听端口 ${PORT}`);
});

在上面的代码中,我们使用 http.createServer 创建了一个服务器。这个服务器会监听传入的请求,并使用回调函数来处理它们。

处理不同的请求方法

在实际应用中,我们经常需要根据请求的方法来执行不同的逻辑。常见的方法有 GETPOST

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
const http = require('http');

const server = http.createServer((req, res) => {
if (req.method === 'GET') {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('这是一个 GET 请求\n');
} else if (req.method === 'POST') {
let body = '';

req.on('data', chunk => {
body += chunk.toString(); // 将数据块转换为字符串
});

req.on('end', () => {
res.statusCode = 200;
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify({ message: '这是一个 POST 请求', data: body }));
});
} else {
res.statusCode = 405; // 方法不允许
res.end('方法不允许\n');
}
});

const PORT = 3000;
server.listen(PORT, () => {
console.log(`服务器正在运行,监听端口 ${PORT}`);
});

在这个示例中,我们处理了 GETPOST 请求。对于 POST 请求,我们使用了事件监听器来收集数据,直到接收到所有数据块。

解析请求 URL

我们可以使用 Node.js 的 url 模块来解析请求的 URL。这样可以根据不同的路径提供不同的响应。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const http = require('http');
const url = require('url');

const server = http.createServer((req, res) => {
const parsedUrl = url.parse(req.url, true);
const pathname = parsedUrl.pathname;

if (pathname === '/hello') {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('你好,欢迎访问 /hello!\n');
} else {
res.statusCode = 404;
res.setHeader('Content-Type', 'text/plain');
res.end('未找到该路径\n');
}
});

const PORT = 3000;
server.listen(PORT, () => {
console.log(`服务器正在运行,监听端口 ${PORT}`);
});

在这段代码中,我们使用 url.parse 解析请求的 URL,并根据请求的路径做出不同的响应。

处理查询字符串

我们还可以处理 URL 中的查询字符串,以更灵活地响应请求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const http = require('http');
const url = require('url');

const server = http.createServer((req, res) => {
const parsedUrl = url.parse(req.url, true);
const query = parsedUrl.query;

if (parsedUrl.pathname === '/greet') {
const name = query.name || '游客'; // 获取查询参数
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end(`你好,${name}!\n`);
} else {
res.statusCode = 404;
res.end('未找到该路径\n');
}
});

const PORT = 3000;
server.listen(PORT, () => {
console.log(`服务器正在运行,监听端口 ${PORT}`);
});

在此示例中,我们处理了一个名为 /greet 的路径,并根据查询字符串中的 name 参数做出个性化的回应。

小结

到这里,我们简单地介绍了如何使用 Node.js 处理 HTTP 请求和响应。通过创建服务器、处理不同的方法、解析 URL 和查询字符串,我们可以构建出功能强大的网络应用程序。希望通过这些示例能帮助你更好地掌握 Node.js 的请求和响应处理。

24 Node.js静态文件服务

24 Node.js静态文件服务

在本小节中,我们将学习如何使用Node.js建立一个简单的静态文件服务,以便为客户端提供HTML、CSS、JavaScript等静态文件。

环境准备

首先,请确保你已经安装了Node.js。可以通过以下命令检查Node.js和npm(Node包管理器)是否已正确安装:

1
2
node -v
npm -v

创建项目

我们将创建一个简单的项目来提供静态文件服务。首先,创建一个新目录并进入其中:

1
2
mkdir static-server
cd static-server

然后,初始化一个新的Node.js项目:

1
npm init -y

这将生成一个package.json文件,其中包含项目的基本信息。

安装所需模块

我们将使用内置的httpfs模块,因此无需额外安装。如果你希望使用更方便的静态文件服务,可以选择使用serveexpress等库。但为了学习的目的,这里我们将手动创建一个基础的静态文件服务。

创建静态文件

在项目目录中,创建一个名为public的文件夹,用于存放静态文件:

1
mkdir public

public文件夹中,创建一个简单的index.html文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- public/index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Static File Server</title>
</head>
<body>
<h1>欢迎来到静态文件服务</h1>
<p>这是一个简单的示例页面。</p>
</body>
</html>

编写静态文件服务代码

在项目根目录下,创建一个名为server.js的文件。然后,添加以下代码来设置一个简单的HTTP服务器并提供静态文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// server.js
const http = require('http');
const fs = require('fs');
const path = require('path');

// 创建HTTP服务器
const server = http.createServer((req, res) => {
// 获取请求的文件路径
let filePath = path.join(__dirname, 'public', req.url === '/' ? 'index.html' : req.url);

// 确定文件扩展名,设定响应类型
const extname = String(path.extname(filePath)).toLowerCase();
const mimeTypes = {
'.html': 'text/html',
'.js': 'text/javascript',
'.css': 'text/css',
'.json': 'application/json',
'.png': 'image/png',
'.jpg': 'image/jpg',
'.gif': 'image/gif',
'.svg': 'image/svg+xml',
'.wav': 'audio/wav',
'.mp4': 'video/mp4',
'.woff': 'application/font-woff',
'.ttf': 'application/font-ttf',
'.eot': 'application/vnd.ms-fontobject',
'.otf': 'application/font-sfnt',
'.css.map': 'text/css',
};

const contentType = mimeTypes[extname] || 'application/octet-stream';

// 读取文件并返回响应
fs.readFile(filePath, (error, content) => {
if (error) {
if (error.code == 'ENOENT') {
// 文件未找到
res.writeHead(404, { 'Content-Type': 'text/html' });
res.end('<h1>404 Not Found</h1>', 'utf-8');
} else {
// 服务器错误
res.writeHead(500);
res.end('Sorry, there was an error: ' + error.code + ' ..\n');
}
} else {
// 正常返回文件内容
res.writeHead(200, { 'Content-Type': contentType });
res.end(content, 'utf-8');
}
});
});

// 启动服务器
const PORT = 3000;
server.listen(PORT, () => {
console.log(`静态文件服务器已启动,访问 http://localhost:${PORT}`);
});

启动服务器

在终端中运行以下命令以启动服务器:

1
node server.js

你应该会看到如下输出:

1
静态文件服务器已启动,访问 http://localhost:3000

访问静态文件

打开你的浏览器,访问http://localhost:3000。如果你成功,应该会看到index.html中的内容。

此外,你还可以向public文件夹添加其他静态文件(例如CSS、JS等),并通过URL访问它们,例如http://localhost:3000/style.css。确保在filePath中提供正确的文件名。

总结

至此,我们已经实现了一个简单的静态文件服务。它能够根据客户端的请求提供相应的静态文件。通过这个例子,你可以了解到Node.js的httpfs模块的基本使用,以及如何处理请求和提供文件内容。在实际应用中,可以使用更高级的框架如Express进行类似的功能扩展。