安装及配置Node.js
安装Node.js
1、安装node版本控制插件
代码语言:javascript复制npm install n -g
2.安装指定版本
代码语言:javascript复制sudo n v14.15.0
3.进入用户目录,找到.bashrc文件,文件末尾添加以下代码(例如/usr/.bashrc)
代码语言:javascript复制#在文件末尾添加如下行(bin目录下只要有node可执行文件就行)
export PATH="/usr/local/n/node/bin:$PATH"
4.安装npm(Node包管理器)
代码语言:javascript复制sudo npm install -g npm
5.安装serve组件
代码语言:javascript复制npm install -g serve
6.安装Express框架
代码语言:javascript复制npm install express body-parser
配置Node.js
注:配置Node.js并设置持续监听某一端口,以及开机自动运行。
一、创建一个名为server.js的node.js文件用来监听处理前端传来的请求
代码语言:javascript复制//这是一个完整的node.js文件
const express = require('express');
const bodyParser = require('body-parser');
// 添加这一行以引入fs模块
const fs = require('fs');
// 创建Express应用实例
const app = express();
// 设置允许跨域访问的中间件(要处理post请求必须要有该代码)
app.use((req, res, next) => {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, DELETE');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
res.setHeader('Access-Control-Allow-Credentials', true);
// 对于预检OPTIONS请求,直接返回200
//(前端访问后端时都会先发一个预检请求,预检返回200时才会真正访问后端
if (req.method === 'OPTIONS') {
return res.sendStatus(200);
}
next();
});
// 使用body-parser解析JSON请求体
app.use(bodyParser.json());
//设置一个处理POST请求的路由,前端访问后端http填写则需要“ip:2000/api/abc”的形式
app.post('/api/abc', (req, res) => {
// 获取前端发送过来的JSON数据
const jsonData = req.body;
// 定义存储文件的路径和名称,这里使用绝对路径
const filePath = '/var/www/html/a/save/';
// 将JSON对象转换为字符串并写入文件
try {
//在服务器指定路径保存文件
fs.writeFileSync(filePath, JSON.stringify(jsonData, null, 2), 'utf8');
//返回一个值200给前端,告诉前端后端接收到了数据
res.status(200).json({ message: 'data-ok' });
} catch (err) {
res.status(500).json({ error: 'Internal server error while saving data' });
}
});
//监听2000端口
const PORT = process.env.PORT || 2000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
二、CD进入server.js文件所在的目录,安装express
代码语言:javascript复制sudo npm install express
三、CD进入server.js文件所在的目录,运行server.js
注:如果是云服务器,记得去云平台安全组放开node监听的端口。
代码语言:javascript复制node service.js
四、将node.js文件设置为开机自动运行且保持后台
注:如果要开机启动多个node.js,就要新建多个.service服务,并且针对配置。
1.安装nano:
代码语言:javascript复制sudo yum install -y nano
2.创建systemd服务文件:
注:my-node-app
为你要创建的服务文件名。
sudo nano /etc/systemd/system/my-node-app.service
3.填写服务文件内容:
代码语言:javascript复制[Unit]
//描述你的Node.js应用。例如:Description=My Node.js Web Server
Description=server.js Web Server
//表示该服务应在哪个目标后启动。network.target表示在网络接口初始化完成后启动此服务
After=network.target
[Service]
//此为你的node.js文件路径
ExecStart=/usr/bin/node /path/to/your/server.js
//设置服务重启策略。Restart=always 表示如果服务停止,则自动重启
Restart=always
//此为用什么用户运行该服务
User=user
//此为用什么用户组运行该服务
Group=user
//如果需要设置环境变量,这里可以添加。
//例如,如果你希望在生产环境中运行,设置 NODE_ENV=production。
Environment=NODE_ENV=production
[Install]
//这里指定当系统进入哪种运行级别或目标时,应该启动此服务。
//multi-user.target代表多用户命令行模式(无图形界面)。
//表示在系统启动到多用户状态后启动此服务。
WantedBy=multi-user.target
注:保存并退出 nano 编辑器:按 Ctrl X 键,然后按 Y 键确认保存更改,最后按 Enter 键退出编辑器。
4.更新systemd配置:
代码语言:javascript复制sudo systemctl daemon-reload
5.启用新服务:
代码语言:javascript复制sudo systemctl enable server.service
6.启动服务:
代码语言:javascript复制sudo systemctl start server.service
7.查看服务运行状态:
代码语言:javascript复制systemctl status server.service
8.查看服务日志:
代码语言:javascript复制journalctl -u server.service
Node.js学习心得
用户访问HTML,HTML调用js,js发出POST请求向服务器提交数据,此时服务器上的node.js文件是如何运行的呢?
答:在用户访问HTML页面,页面中的js发出POST请求提交数据时,服务器端的Node.js已经启动并监听特定端口以接收这些请求。
代码语言:javascript复制 ------------------------- -----------------------
| 用户浏览器 | | Node.js服务器 |
------------------------- -----------------------
| |
| 1. 访问HTML页面 |
|-------------------------->|
| |
| 2. HTML页面加载JS脚本 |
|<---------------------------|
| |
| 3. JS脚本发起POST请求 |
|-------------------------->|
| (携带数据:如JSON、表单) |
| |
| 4. 请求到达Node.js服务器 |
| |
| 5. Node.js使用HTTP模块(如Express)监听端口 |
| |
| 6. 请求与处理中间件匹配 |
| |
| 7. Node.js解析POST数据 |
| |
| 8. 执行业务逻辑(如数据库操作)|
| |
| 9. Node.js构建响应内容 |
|<---------------------------|
| |
|10. 响应返回至浏览器 |
| |
------------------------- -----------------------
Node.js常用功能代码
获取并本地存储前端传输的数据
注:监听前端post方式向后端node指定端口发送数据的请求,并将数据接收处理后存储服务器本地文件
代码语言:javascript复制//这是一个完整的node.js文件
const express = require('express');
const bodyParser = require('body-parser');
// 添加这一行以引入fs模块
const fs = require('fs');
// 创建Express应用实例
const app = express();
// 设置允许跨域访问的中间件(要处理post请求必须要有该代码)
app.use((req, res, next) => {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, DELETE');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
res.setHeader('Access-Control-Allow-Credentials', true);
// 对于预检OPTIONS请求,直接返回200
//(前端访问后端时都会先发一个预检请求,预检返回200时才会真正访问后端
if (req.method === 'OPTIONS') {
return res.sendStatus(200);
}
next();
});
// 使用body-parser解析JSON请求体
app.use(bodyParser.json());
//设置一个处理POST请求的路由,前端访问后端http填写则需要“ip:2000/api/abc”的形式
app.post('/api/abc', (req, res) => {
// 获取前端发送过来的JSON数据
const jsonData = req.body;
// 定义存储文件的路径和名称,这里使用绝对路径
const filePath = '/var/www/html/a/save/';
// 将JSON对象转换为字符串并写入文件
try {
//在服务器指定路径保存文件
fs.writeFileSync(filePath, JSON.stringify(jsonData, null, 2), 'utf8');
//返回一个值200给前端,告诉前端后端接收到了数据
res.status(200).json({ message: 'data-ok' });
} catch (err) {
res.status(500).json({ error: 'Internal server error while saving data' });
}
});
//监听2000端口
const PORT = process.env.PORT || 2000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
模拟shell执行指令并解析结果
代码语言:javascript复制const express = require('express');
const bodyParser = require('body-parser');
const fs = require('fs');// 添加这一行以引入fs模块,用于写入文件
const { exec } = require('child_process');// 添加这一行以引入child_process模块,用于模拟shell执行指令读取虚拟内存信息
// 创建Express应用实例
const app = express();
// 设置允许跨域访问的中间件(要处理post请求必须要有该代码)
app.use((req, res, next) => {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, DELETE');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
res.setHeader('Access-Control-Allow-Credentials', true);
// 对于预检OPTIONS请求,直接返回200(前端访问后端时都会先发一个预检请求,预检返回200时才会真正访问后端
if (req.method === 'OPTIONS') {
return res.sendStatus(200);
}
next();
});
//如果监听到前端查询磁盘信息的请求,走这里处理
// 设置一个处理POST请求的路由,前端访问后端http填写则需要“ip/api/a”的形式
app.post('/api/a', (req, res) => {
//模拟shell执行指令读取磁盘信息
function getVirtualMemoryInfo(callback) {
exec('df -k /dev/vda1', (error, stdout, stderr) => {
if (error) {
return;
}
//对shell执行后读取到的硬盘信息进行处理解析
const lines = stdout.split('n');
const memoryInfoLine = lines[1];//只解析df -k执行后结果的第一行
//分割并提取相关信息
const memoryData = memoryInfoLine.trim().split(/s /);
const totaldisk = memoryData[1]; // 磁盘总容量,即第1行1列
const useddisk = memoryData[2]; // 磁盘已用空间,即第1行2列
const zhanyongdisk = memoryData[4]; // 磁盘占用率,即第1行4列
//返回执行的结果
callback(null, totaldisk, useddisk,zhanyongdisk);
});
}
//使用回调函数接收shell执行指令读取解析后的硬盘信息结果
getVirtualMemoryInfo((err, total_disk_, used_disk_,zydisk) => {
if (!err) {
const total_disk = (total_disk_ / 1024 / 1024 ).toFixed(2);
const used_disk = (used_disk_ / 1024 / 1024 ).toFixed(2);
console.log('磁盘总容量:', total_disk);
console.log('磁盘已用空间:', used_disk);
console.log('磁盘占用率:', zydisk);
//将获取到的数据整合到一个变量,稍后转换为json
const data = { total_disk,used_disk,zydisk};
//定义存储文件的路径和名称
const filePath = '/var/www/html/a' '.json';
//将获取到的内存信息以json形式保存至本地/var/www/html/a.json
try {
//在服务器指定路径保存文件
fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf8');
res.status(200).json({ message: 'data-ok' });
} catch (err) {
console.error('Caught an error while saving file:', err);
res.status(500).json({ error: 'Internal server error while saving data' });
}
}
});
});
查询系统物理内存信息
代码语言:javascript复制const express = require('express');
const bodyParser = require('body-parser');
const os = require('os');// 添加这一行以引入os模块,用于读取物理内存信息
// 创建Express应用实例
const app = express();
// 设置允许跨域访问的中间件(要处理post请求必须要有该代码)
app.use((req, res, next) => {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, DELETE');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
res.setHeader('Access-Control-Allow-Credentials', true);
// 对于预检OPTIONS请求,直接返回200(前端访问后端时都会先发一个预检请求,预检返回200时才会真正访问后端
if (req.method === 'OPTIONS') {
return res.sendStatus(200);
}
next();
});
//如果是查询内存信息post,走这里处理
// 设置一个处理POST请求的路由,前端访问后端http填写则需要“ip/api/me”的形式
app.post('/api/me', (req, res) => {
// 获取总物理内存(单位:GB)
const totalPhysicalMemoryBytes = os.totalmem();
const totalPhysicalMemoryGB = (totalPhysicalMemoryBytes / 1024 / 1024 / 1024).toFixed(2);
// 获取剩余可用物理内存(单位:GB)
const freePhysicalMemoryBytes = os.freemem();
const freePhysicalMemoryGB = (freePhysicalMemoryBytes / 1024 / 1024 / 1024).toFixed(2);
});
查询CPU信息
代码语言:javascript复制const express = require('express');
const bodyParser = require('body-parser');
const osu = require('node-os-utils');//引入此模块读取cpu占用率
const cpu = osu.cpu; //引入此模块读取cpu占用率
// 创建Express应用实例
const app = express();
// 设置允许跨域访问的中间件(要处理post请求必须要有该代码)
app.use((req, res, next) => {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, DELETE');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
res.setHeader('Access-Control-Allow-Credentials', true);
// 对于预检OPTIONS请求,直接返回200(前端访问后端时都会先发一个预检请求,预检返回200时才会真正访问后端
if (req.method === 'OPTIONS') {
return res.sendStatus(200);
}
next();
});
//如果是查询内存信息post,走这里处理
// 设置一个处理POST请求的路由,前端访问后端http填写则需要“ip/api/cpu”的形式
app.post('/api/cpu', (req, res) => {
// 获取CPU使用率
const usage = await cpu.usage();
});