【 Node.js 教程(一)】安装、配置及初步使用
1. Node.js简介
2. Node.js的安装和配置
3. Node.js使用测试
4. 系统后台运行Node.js 应用程序
5. Excel文件读取和显示
1. Node.js简介
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时,它使用事件驱动、非阻塞 I/O 模型来构建轻量且高效的网络应用。以下是 Node.js 的发展历史和最新版本的介绍:
- 2009 年:Ryan Dahl 开始开发 Node.js,最初是为了使 JavaScript 能够在服务器端运行。
- 2010 年:第一个稳定版本 0.1.14 发布,随后发布了一系列的版本,改进了稳定性和性能。
- 2011 年:Node.js 的社区开始发展壮大,并发布了 0.4 和 0.6 版本,增加了很多新功能和改进。
- 2012 年:Node.js 的社区出现分裂,因为在维护 Node.js 的过程中出现了一些问题。因此,一部分社区成员创建了 io.js 项目,这个项目包含了很多 Node.js 中没有的新特性。
- 2015 年:Node.js 社区宣布与 io.js 合并,将两个项目合并为一个单一的 Node.js 项目。这个决定受到了 Node.js 开发者和用户的欢迎,因为它标志着 Node.js 社区的统一。
- 2016 年:Node.js 6.x 版本发布,成为了长期支持版本(LTS)。该版本提供了一些新特性和性能优化,包括对 ES6 语法的更好支持和更快的模块加载速度。
- 2017 年:Node.js 8.x 版本发布,成为了新的长期支持版本(LTS)。该版本提供了很多新特性和改进,包括异步追踪和性能优化。
- 2018 年:Node.js 10.x 版本发布,成为了新的长期支持版本(LTS)。该版本增加了很多新特性,包括对 ES6 中新特性的更好支持、更好的安全性和更快的网络连接。
- 2020 年:Node.js 14.x 版本发布,成为了新的长期支持版本(LTS)。该版本提供了许多新功能和改进,包括对 WebAssembly 的支持、增强的异步追踪和改进的调试功能。
- 2021 年:Node.js 16.x 版本发布,它是当前的最新版本。该版本包含了很多新特性和改进,包括对 ECMAScript 中新特性的更好支持、更快的 HTTP 请求、更好的 WebSocket 支持和更好的诊断工具等。
总的来说,Node.js 的发展历程一直在不断地演化和发展,每个版本都带来了新的特性和改进。最新版本的 Node.js 提供了更好的性能、更好
2. Node.js的安装和配置
在安装 Node.js 之前,建议先运行 yum update
命令,以确保您的 CentOS 系统已经更新到最新的软件包和安全补丁。这将确保您的系统处于最新的状态,并且可以避免在安装 Node.js 时遇到由于依赖项问题而失败的情况。您可以使用以下命令运行 yum update
:
sudo yum update
要使用 Node.js 官方源在 CentOS 系统中安装 Node.js,可以按照以下步骤进行操作:
1. 添加 Node.js 包的 yum 源:
curl -sL https://rpm.nodesource.com/setup_16.x | sudo bash -
上述命令将添加 Node.js v16.x 的 yum 源。
2. 安装 Node.js:
sudo yum install nodejs
此命令将安装 Node.js 和 npm。
3. 验证 Node.js 安装:
node -v
此命令将显示您安装的 Node.js 版本号。
请注意,上述命令中的版本号可能会随着时间的推移而发生变化。如果要安装其他版本的 Node.js,请在第一步中更改版本号。
4. 此外,如果您需要安装开发和构建 Node.js 应用程序所需的编译器和工具等依赖项,可以使用以下命令:
sudo yum groupinstall "Development Tools"
在 Nginx 配置文件中添加 Node.js 相关设置,可以按照以下步骤进行:
5. 打开 Nginx 配置文件:
sudo vi /etc/nginx/nginx.conf
6. nginx中Node.js的location配置:
在server块中添加了一个location块,它监听路径为/node
,表示请求路径以/node
开头的请求都将被代理到Node.js应用。其中,proxy_pass
指令指定了Node.js应用的监听地址,proxy_set_header
指令设置了一些请求头,以确保请求可以正确地被传递到Node.js应用中。
注意,这里的Node.js应用监听地址需要替换为实际应用的监听地址。
location /node {
proxy_pass http://127.0.0.1:3000; # 替换为您Node.js应用的监听地址
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
这段代码是一个简单的 Node.js 服务器,它监听本地 IP 地址 127.0.0.1 和端口号 3000。当有请求到达时,服务器会返回一个状态码为 200 的响应,内容为 "Hello, World!\n"。这个服务器使用了 Node.js 内置的 http 模块来创建和启动服务器。
如果你想要修改服务器的响应内容,可以修改 res.end('Hello, World!\n'); 这一行代码中的字符串。如果你想要修改服务器监听的 IP 地址和端口号,可以修改 const hostname = '127.0.0.1'; 和 const port = 3000; 这两行代码中的值。
7. 保存配置文件并重启 Nginx 服务:
sudo systemctl restart nginx
8. npm包的安装:全局安装和本地安装(可选)
在使用npm时,我们可以通过本地安装和全局安装两种方式安装包。
本地安装:将包安装到当前项目的node_modules目录中,只有在当前项目下才能使用该包。本地安装可以通过在命令行中使用npm install <package>
或npm i <package>
进行安装。例如,npm install express
将安装Express包到当前项目的node_modules目录中。
全局安装:将包安装到全局的node_modules目录中,可以在命令行的任何位置使用该包。全局安装可以通过在命令行中使用npm install -g <package>
进行安装。例如,npm install -g nodemon
将全局安装Nodemon包。
总的来说,本地安装适用于项目级别的依赖,而全局安装适用于全局的工具和命令行实用程序。
一般情况下,推荐在项目目录中进行本地安装。这样可以保证每个项目的依赖是独立的,避免不同项目之间依赖的冲突和混乱。在项目目录中本地安装时,可以通过在 package.json 文件中添加依赖并使用 npm install 命令来安装项目所需的依赖。
全局安装可以让包在本地系统中的任何地方都可以使用,但是如果在多个项目中同时使用一个全局安装的包,可能会导致版本冲突和不可预期的问题。因此,全局安装的情况一般比较少见,只有在需要在命令行中使用的包(如 gulp、webpack 等)时才推荐全局安装。
如果您要查看本地项目中安装的模块,您可以进入项目目录并执行:
npm list --depth 0
列出全局安装的 Node.js 模块,并且仅显示直接安装的模块(即深度为 0)
npm list -g --depth 0
3. Node.js使用测试
可以使用以下步骤测试上述Node.js配置文件是否生效:
1. 在服务器上创建一个名为server.js
的文件,并将下述JavaScript代码粘贴到其中。
server.js
// server.js
const http = require('http');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello, World!\n');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
2. 保存并退出文件。
3. 在终端中使用node server.js
命令启动Node.js应用。
node server.js
4. 在浏览器中访问https://domain.com/node
,如果能够看到Hello, World!
的输出,则表示Node.js配置已经生效,否则需要检查配置文件和Node.js应用代码是否正确。
需要注意的是,由于配置文件中将Node.js应用代理到了https://domain.com/node
路径下,因此在访问Node.js应用时需要在路径前面加上/node
前缀。
下面这段代码是一个基于 Node.js 的 HTTP 服务器,它可以获取客户端的 IP 地址、所在的国家和省市信息、浏览器版本和操作系统信息,并输出到客户端的浏览器上。需要安装的库有:
- request-ip:用于获取客户端的 IP 地址
- geoip-lite:用于获取客户端所在的国家和省市信息
- useragent:用于获取客户端的 user agent 信息
test.js
const http = require("http");
const requestIp = require("request-ip");
const geoip = require("geoip-lite");
const useragent = require("useragent");
const hostname = "127.0.0.1"; // 服务器地址
const port = 3000; // 服务器端口号
const server = http.createServer((req, res) => {
// 获取客户端的 IP 地址
const clientIp = requestIp.getClientIp(req);
// 获取客户端所在的国家和省市信息
const geo = geoip.lookup(clientIp);
res.statusCode = 200;
res.setHeader("Content-Type", "text/html");
// 格式化日期和时间
const date = new Date().toLocaleString();
// 获取客户端的 user agent
const agent = useragent.parse(req.headers["user-agent"]);
// 输出欢迎消息、日期、IP地址、浏览器版本和操作系统信息以及客户端所在的国家和省市信息
res.write(`<h1>Welcome to my server!</h1>`);
res.write(`<p>Current date and time: ${date}</p>`);
res.write(`<p>Your IP address: ${clientIp}</p>`);
res.write(`<p>Your browser: ${agent.toAgent()}</p>`);
res.write(`<p>Your operating system: ${agent.os.toString()}</p>`);
if (geo) {
res.write(`<p>Your country: ${geo.country}</p>`);
res.write(`<p>Your city: ${geo.city}</p>`);
} else {
res.write(`<p>Could not determine your location.</p>`);
}
res.end();
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
4. 系统后台运行Node.js 应用程序
在 CentOS 系统上可以使用 pm2
来将 Node.js 应用程序作为守护进程运行,以确保在关闭终端后应用程序仍然在后台运行。您可以按照以下步骤安装和使用 pm2
:
1. 首先使用 npm
安装 pm2
,可以使用以下命令:
npm install pm2 -g
2. 在 pm2
中启动应用程序,可以使用以下命令:
pm2 start server.js
如果需要指定运行的实例数,可以使用 -i
参数,例如:
pm2 start server.js -i 4
这将在后台运行server.js,并创建4个工作进程处理客户端请求。根据系统资源和应用程序需求,可以根据需要调整工作进程的数量。通常,建议将其设置为CPU核心数的2倍。在上述示例中,如果系统有至少8个CPU核心,则可以将工作进程数设置为8。
3. 现在,您的 Node.js 应用程序已经在 pm2
中作为守护进程运行了,可以使用以下命令来查看所有正在运行的应用程序:
pm2 list
4. 如果需要停止应用程序,可以使用以下命令:
pm2 stop server
这将停止名为 server
的应用程序。
5. 如果需要在系统启动时自动启动应用程序,可以使用以下命令:
pm2 startup
这将自动为您生成一个启动脚本,并将其注册为服务。在系统启动时,pm2
会自动启动所有已注册的应用程序。
希望这些步骤能够帮助您在 CentOS 上成功地将 Node.js 应用程序作为守护进程运行。
5. Excel文件读取和显示
下面代码的功能是创建一个 HTTP 服务器,该服务器将读取名为“example.xlsx”的 Excel 文件,并将其转换为 HTML 表格。该表格将使用 DataTables 插件进行格式化和排序。具体来说,代码将使用 http 模块创建一个 HTTP 服务器,该服务器将在本地主机的端口 3000 上运行。然后,它将使用 xlsx 库读取 Excel 文件,并将其转换为 JSON 格式。接下来,它将使用 html-entities 库对 JSON 数据进行 HTML 实体编码,以避免 XSS 攻击。最后,它将使用 DataTables 插件将 HTML 表格格式化和排序,并将其发送回客户端。
下面代码需要安装以下库:
- http:Node.js 内置的 HTTP 模块,用于创建 HTTP 服务器和客户端。
- xlsx:用于读取和写入 Excel 文件的 JavaScript 库。
- fs:Node.js 内置的文件系统模块,用于读取和写入文件。
- path:Node.js 内置的路径模块,用于处理文件路径。
- html-entities:用于 HTML 实体编码和解码的 JavaScript 库。
您可以使用以下命令来安装这些库:
npm install http xlsx fs path html-entities
const http = require('http');
const xlsx = require('xlsx');
const fs = require('fs');
const path = require('path');
const { encode } = require('html-entities');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
const workbook = xlsx.readFile('example.xlsx');
const sheet_name_list = workbook.SheetNames;
const data = xlsx.utils.sheet_to_json(workbook.Sheets[sheet_name_list[0]]);
const html = `
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Excel Table</title>
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.25/css/jquery.dataTables.min.css">
<style>
table, th, td {
border: 1px solid lightgray;
}
</style>
</head>
<body>
<table id="example" class="display">
<thead>
<tr>
${Object.keys(data[0]).map(key => `<th>${encode(key)}</th>`).join('')}
</tr>
</thead>
<tbody>
${data.map(row => `
<tr>
${Object.values(row).map(value => `<td>${encode(value)}</td>`).join('')}
</tr>
`).join('')}
</tbody>
</table>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdn.datatables.net/1.10.25/js/jquery.dataTables.min.js"></script>
<script>
$(document).ready(function() {
$('#example').DataTable();
});
</script>
</body>
</html>
`;
res.statusCode = 200;
res.setHeader('Content-Type', 'text/html');
res.end(html);
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});