前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Node.js常用功能代码及心得

Node.js常用功能代码及心得

作者头像
云端之上
发布2024-03-12 11:33:01
1220
发布2024-03-12 11:33:01
举报
文章被收录于专栏:云端之上云端之上

安装及配置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为你要创建的服务文件名。

代码语言:javascript
复制
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();
});
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-02-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装及配置Node.js
    • 安装Node.js
      • 配置Node.js
      • Node.js学习心得
      • Node.js常用功能代码
        • 获取并本地存储前端传输的数据
          • 模拟shell执行指令并解析结果
            • 查询系统物理内存信息
              • 查询CPU信息
              相关产品与服务
              消息队列 TDMQ
              消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档