Centos上部署Node服务和MongoDB

文章目录

  • 1.Centos上安装运行Node服务
    • 1. 安装Node.js
    • 2.验证Node.js安装
    • 3.运行Node.js应用程序
    • 4.调试Node.js应用
  • 2.Centos上安装MongoDB
  • 3.创建Node服务
    • 1.配置初始化文件
    • 2.创建index.js文件
    • 3.启动服务
    • 3.配置公网访问
      • forever的引入
      • pm2的引入
    • 4.应对CORS跨域
      • 使用cors中间件
      • 手动设置CORS响应头
    • 5.爬取数据
    • 6.编写get方法
    • 7.编写post方法
  • 4.Node通过mongoose操作mongodb

1.Centos上安装运行Node服务

1. 安装Node.js

可以使用NodeSource仓库来安装Node.js,这样可以保持最新版本。以下是安装Node.js的步骤:

curl -sL https://rpm.nodesource.com/setup_16.x | sudo bash -
sudo yum install -y nodejs

这将安装Node.js版本16.x的稳定版

2.验证Node.js安装

安装完成后,可以通过以下命令验证Node.js是否正确安装:

node -v

这将显示安装的Node.js版本。

3.运行Node.js应用程序

假设你有一个名为app.js的Node.js应用程序文件,你可以通过以下命令运行它:

node app.js

确保你的应用程序文件(例如app.js)是可执行的,并且位于当前工作目录或指定路径。

4.调试Node.js应用

方式一:直接在项目启动运行时,添加上 –inspect 代码,启动后,在Chrome浏览器点开F12,会发现多了一个绿色的按钮。

node --inspect index.js

方式二:如果不打算在启动项目时就启动调试工具的话,还可以在 app.js 或者其它 js 文件里面把工具引入进来,并启动它。

const inspector = require('inspector');
inspector.open();
console.log('在app.js里面启动')

2.Centos上安装MongoDB

在CentOS上安装MongoDB,可以遵循以下步骤:

  1. 配置MongoDB仓库,创建MongoDB仓库文件。
  2. 安装MongoDB包。
  3. 启动MongoDB服务。
  4. 配置MongoDB自启动。

以下是具体的命令:

# 1. 导入MongoDB公钥
sudo rpm --import https://www.mongodb.org/static/pgp/server-4.2.asc# 2. 创建MongoDB仓库文件
echo '[mongodb-org-4.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc' | sudo tee /etc/yum.repos.d/mongodb-org-4.2.repo# 3. 安装MongoDB
sudo yum install -y mongodb-org# 4. 启动MongoDB
sudo systemctl start mongod# 5. 设置MongoDB开机自启
sudo systemctl enable mongod# 6. 检查MongoDB服务状态
sudo systemctl status mongod# 7. 查看运行端口
netstat -tulnp | grep mongod

3.创建Node服务

1.配置初始化文件

  1. 新建文件夹
  2. 输入命令npm init,生成package.json文件
  3. 安装 expressmongoosecorsnodemon
    • Express 是一个保持最小规模的灵活的 Node.js Web 应用程序开发框架
    • mongoose 是一个可以运行在Node.js上简化编写MongoDB验证逻辑
    • nodemon用来监视node.js应用程序中的任何更改并自动重启服务,非常适合用在开发环境中
    • cors设置CORS(跨来源资源共享)响应头
    npm i express mongoose nodemon cors
    

2.创建index.js文件

//导入express
const express = require('express')
//创建web服务器
const app=express()
// 通过ap.listen进行服务器的配置,并启动服务器,接收两个配置参数,一个是对应的端口号,一个是启动成功的回调函数
app.listen(9588,()=>{console.log('服务器启动成功');
})

3.启动服务

将文件夹整个导入到linux服务器上,注意开启的端口需要放开,linux默认只开启22端口,所以要向外部访问就得开启防火墙上对应端口访问设置

1.启动服务

node index.js

2.使用ss查看端口:

ss -tuln

3.查看防火墙对应端口是否开放

// 查看防火墙状态
systemctl status firewalld
// 查看端口状态输入以下命令:
firewall-cmd --zone=public --query-port=8080/tcp
// 发现端口没有开放,输入以下命令:
firewall-cmd --zone=public --add-port=8080/tcp --permanent
// 端口开放成功了,输入以下命令使其生效:
firewall-cmd --reload

4.注意端口是否做了映射

3.配置公网访问

forever的引入

forever一个简单的命令行工具,用于保证给定脚本(无论是否是用 Node.js 编写的)连续无间断运行。

1.下载安装

npm install forever -g

2.使用forever启动js

forever start index.js

3.停止js文件命令

forever stop index.js

4.查看启动情况

forever list

pm2的引入

如果你需要以守护进程的方式运行Node.js应用程序,可以使用如pm2这样的进程管理器。首先通过npm安装pm2:

npm install pm2 -g

然后使用pm2启动你的应用程序:

pm2 start app.js

4.应对CORS跨域

CORS需要浏览器和服务器同时支持。浏览器会自动检查某个AJAX请求是否跨源,如果是,则浏览器会首先使用OPTIONS方法发起一个预检请求(preflight request)到服务器,以获知服务器是否允许该跨源请求。服务器收到预检请求后,会在响应头中包含一些CORS相关的头部信息来告知浏览器是否允许该跨源请求。

使用cors中间件

npm install cors

然后,在你的Express应用中引入并使用它:

const express = require('express');  
const cors = require('cors');  
const app = express();  // 允许来自任何源(*)的跨域请求  
// 注意:在生产环境中,你应该只允许来自特定源的请求  
app.use(cors());  // 或者,你可以配置更具体的CORS选项  
app.use(cors({  origin: 'http://example.com', // 只允许来自http://example.com的请求  methods: ['GET', 'POST'], // 允许的HTTP方法  allowedHeaders: ['Content-Type', 'Authorization'], // 允许的HTTP头  credentials: true, // 是否允许携带凭证(cookies, HTTP认证等)  
}));  // ... 你的其他中间件和路由  app.listen(3000, () => {  console.log('Server is running on port 3000');  
});

手动设置CORS响应头

如果你不想使用cors中间件,你也可以在每个路由处理程序中手动设置CORS响应头:

app.get('/api/some-endpoint', (req, res) => {  res.setHeader('Access-Control-Allow-Origin', 'http://example.com');  res.setHeader('Access-Control-Allow-Methods', 'GET, POST');  res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');  // 如果你的API需要凭证,确保设置这个头部  // res.setHeader('Access-Control-Allow-Credentials', 'true');  // ... 你的其他响应代码  
});

但请注意,手动设置CORS响应头可能会更加繁琐,并且难以维护,特别是当你的API有很多端点时。因此,使用cors中间件通常是更好的选择。

5.爬取数据

1.可以使用axios来发送HTTP请求,以及cheerio来解析返回的HTML内容

npm install axios cheerio

编写爬虫方法

//get接口的开发
app.get('/api/list', async (err, res) => {const {data: data1} = await getStarHistory('xiaoosnggao/vue-music', GITHUB_TOKEN);const {data: data2} = await getForkHistory('xiaoosnggao/vue-music', GITHUB_TOKEN);const {data: data3} = await getCommitHistory('xiaoosnggao/vue-music', GITHUB_TOKEN);const {data: data4} = await getWatchHistory('xiaoosnggao/vue-music', GITHUB_TOKEN);res.send({code: 200,data: [data1, data2, data3, data4]})
})

注意:Nodejs中不能只用使用ES6的import方法,需要修改配置或者使用require

6.编写get方法

前端代码get方法通过url传参

await axios.get(`${process.env.VUE_APP_NODE_SERVER}/api/list?id=${this.id}`);

node服务中通过req.query获取参数

//get接口的开发 查询githistory
app.get('/api/list', async (req, res) => {const id = req.query.id;console.log(id)if (id) {// 查询所有用户GitHistory.findOne({id: id}).then(users => {console.error('查询成功', users)res.send({code: 200,data: users})}).catch(err => console.error('查询失败', err));}
})

7.编写post方法

注意:post方法获取参数时,需要先解析JSON请求体
在Express 4.16+ 中,可以使用 express.json()

post方法前端传参通过json格式传送

await axios.post(`${process.env.VUE_APP_NODE_SERVER}/api/setList`, {id: this.id,url: 'https://github.com/immich-app/immich'});

node服务通过req.body获取

//post接口的开发 根据传入的id和url爬取githistory
app.post('/api/setList', async (req, res) => {console.log(req.body)const id = req.body.id;const url = req.body.url;if (id && url) {// 保存数据到数据库GitHistory.updateOne({id: id}, {$set: {id: id,url,}}, {upsert: true}).then(GitHistory => {console.log('保存成功', GitHistory);res.send({code: 200,data: {}})}).catch(err => console.error('保存失败', err));}})

4.Node通过mongoose操作mongodb

1.连接服务

// 导入mongoose
const mongoose = require('mongoose');// 连接到MongoDB数据库
mongoose.connect('mongodb://localhost:27017/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true }).then(() => console.log('MongoDB连接成功')).catch(err => console.error('MongoDB连接失败', err)); // 如果mydatabase数据库不存在会自动创建

2.定义模型

// 定义一个Schema
const GitHistorySchema = new mongoose.Schema({id: String,url: String,history: Object
});// 创建模型
const GitHistory = mongoose.model('GitHistory', GitHistorySchema);

3.插入到数据库

    // 创建一个新GitHistoryconst newGitHistory = new GitHistory({ id: 83462, url:'xiaoosnggao/vue-music', history:{StarHistory:data1,ForkHistory:data2,CommitHistory:data3,WatchHistory:data4,} });// 保存数据到数据库newGitHistory.save().then(GitHistory => console.log('保存成功', GitHistory)).catch(err => console.error('保存失败', err));

4.使用updateOne更新数据库,并使用upsert: true可以当没有查到时,执行插入操作

        // 保存数据到数据库GitHistory.updateOne({id: id}, {$set: {id: id,url,history: {StarHistory,ForkHistory,CommitHistory,WatchHistory,}}}, {upsert: true}).then(GitHistory => {console.log('保存成功', GitHistory);res.send({code: 200,data: {StarHistory,ForkHistory,CommitHistory,WatchHistory,}})}).catch(err => console.error('保存失败', err));

5.使用findOne和条件参数,查询指定一条数据

        // 查询所有用户GitHistory.findOne({id: id}).then(users => {console.error('查询成功', users)res.send({code: 200,data: users})}).catch(err => console.error('查询失败', err));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/26193.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解MySQL分区技术

前言: 在数据量不断增长的当今时代,数据库的性能优化变得尤为重要。MySQL作为一款广泛使用的数据库管理系统,提供了多种性能优化手段,其中分区技术是提升大型表处理效率的有效方法之一。通过将数据分散到多个独立的物理子表中&am…

《大道平渊》· 拾叁 —— 失眠?忍不住乱想?不如反其道而行之!

《平渊》 拾叁 "睡觉的时候就是要胡思乱想" 声明:以下内容针对非失眠症人群,如果失眠不是偶尔发生,而是长期存在,以下内容和你无关,请尽早治疗,遵循医嘱。 失眠的本质是什么?心理因素…

C++并发之锁(std::lock_guard,std::unique_lock)

目录 1 概述2 使用实例3 接口使用3.1 lock_guard3.2 adopt_lock3.3 defer_lock3.4 try_to_lock3.5 try_lock3.6 release3.7 lock3.8 call_one1 概述 锁保护是通过使互斥对象始终处于锁定状态来管理互斥对象的对象。。   在构造时,互斥对象被调用线程锁定,在析构时,互斥被解…

Qt实现信号与槽,模拟Qt的信号与槽,观察者模式

运行在VS2022&#xff0c;x86&#xff0c;Debug下 33. Qt信号与槽 实现原理&#xff1a;观察者模式&#xff0c;即当一个对象被修改时&#xff0c;就会自动通知依赖它的对象。应用&#xff1a;对象间的通信。 33.1. Qt实现信号与槽&#xff0c;代码如下。 #include <QOb…

电脑撤回的快捷键是什么?

下面给大家介绍了各种办公应用的撤回以及反向撤回快捷键介绍&#xff0c;在ps、excel中都是可以使用的。 撤回键是ctrl加什么 1、撤销的快捷键是“CtrlZ”&#xff0c;用于取消上一步操作&#xff0c;对与在电脑系统上或软件内的操作均适用。重复按下可以取消多步操作。 2、而…

乡村振兴的法治保障:加强农村法治建设,完善乡村治理体系,提高农民法治素养,为美丽乡村建设提供有力保障

目录 一、引言 二、加强农村法治建设的必要性 &#xff08;一&#xff09;法治是乡村振兴的基石 &#xff08;二&#xff09;法治是乡村治理的保障 &#xff08;三&#xff09;法治是农民权益的守护者 三、完善乡村治理体系的路径 &#xff08;一&#xff09;加强乡村基…

Talk|CVPR‘24 Oral:超越3D - Point Transformer V3中的多模态特征提取新构想

本期为TechBeat人工智能社区第599期线上Talk。 北京时间6月12日(周三)20:00&#xff0c;香港大学博士生—吴虓杨的Talk已经准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “超越3D - Point Transformer V3中的多模态特征提取新构想”&#xff0c;他通过P…

用教育邮箱在官网安装origin2024中文版教程

打开origin官网&#xff0c;点击learning Edition&#xff0c;教育版只能维持六个月&#xff0c;但是过期之后可以在官网更新&#xff0c;能够免费使用六次&#xff0c;也就是三年。 OriginLab - Origin and OriginPro - Data Analysis and Graphing Software 填写学校信息&…

Java应届第一年规划

&#x1f47d;System.out.println(“&#x1f44b;&#x1f3fc;嗨&#xff0c;大家好&#xff0c;我是代码不会敲的小符&#xff0c;目前工作于上海某电商服务公司…”); &#x1f4da;System.out.println(“&#x1f388;如果文章中有错误的地方&#xff0c;恳请大家指正&…

连接查询-外连接(FULL JOIN)、内连接(JOIN)、自身连接

一、表与表之间存在着某种联系&#xff0c;如果一个查询必须在多个表之间完成&#xff0c;则需要用到连接查询 二、连接查询的SQL查询语句 格式&#xff1a; SELECT A1&#xff0c;A2&#xff0c;...&#xff0c;Am FROM R1&#xff0c;R2&#xff0c;..&#xff0c;Rn WH…

DevExpress WPF中文教程:Grid - 如何完成列和编辑器配置(设计时)?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

NSS题目练习9

[极客大挑战 2020]welcome 界面打开后一片空白&#xff0c;查看题目描述&#xff0c;翻译过来是 1.除了GET请求方法&#xff0c;还有一种常见的请求方法… 2.学习一些关于sha1和array的知识。 3.更仔细地检查phpinfo&#xff0c;你会发现标志在哪里。 补充&#xff1a; sh…

什么是端口转发?路由器如何正确的设置端口转发和范围转发?(外网访问必备设置)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 端口转发 📒🚀 端口转发的应用场景💡 路由器如何设置端口转发(示例)💡 端口范围转发(示例)🎯 范围转发的应用场景🛠️ 设置范围转发📝 范围转发实操示例🎈 注意事项 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 …

pyinstaller打包exe多种失败原因解决方法

pyinstaller打包exe多种失败原因解决方法 目录 pyinstaller打包exe多种失败原因解决方法1、pyinstaller安装有问题1.1 安装pyinstaller1.2 采用anconda的环境启动 2、pyqt5与pyside6冲突2.1 打包生成.spec文件2.2 编辑spec文件 3、打包成功后打不开exe&#xff0c;exe闪退3.1 s…

模拟电子之电子管

如果要实现一个放大器的功能&#xff0c;需要一个固定的放大倍数&#xff08;Gain&#xff09;&#xff0c;这也就是说输出信号应该是跟随输入信号变化而变化&#xff0c;换句话说输出信号应该要受到输入信号的控制。 在电子学中使用的最多的两个物理量就是电压和电流&#xf…

算法设计与分析复习(第5章 回溯法)

7-1 子集和问题 #include<iostream> using namespace std;int n; int c; int final0; //当前元素加到最后一个元素 的总和 int sum0; //已选元素之和 int a[10000]; //原数组 bool b[10000]; //判断元素选不选bool Backtrack(int t){ if(sumc) return true; //已…

abap 多线程运行demo

SAP 提供多种多线程的方法去优化程序的执行效率 1.分别执行多个job 2.Call function STARTING NEW TASK 3.直接使用SAP 提供的SPTA 框架函数&#xff1a;SPTA_PARA_PROCESS_START_2 本次&#xff0c;我们着重来介绍一下三种方法中函数的使用方法 获取空闲线程数&#xff1a…

归纳阜阳市各区县皖北地区经济发展财政贴息项目申报时间条件及认定材料、流程

归纳阜阳市各区县皖北地区经济发展财政贴息项目申报时间条件及认定材料、流程等内容整理如下&#xff0c;颍州区、颍东区、颍泉区、临泉县、太和县、阜南县、颍上县、界首市各地申报的可指导&#xff01; 一、项目申报 (一)上报项目&#xff1a;各县市区、阜阳经开区各最多报…

「51媒体」江苏有哪些媒体-参会-宣发-专访-直播

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 在江苏省&#xff0c;媒体资源丰富&#xff0c;涵盖了参会、宣发、专访和直播等多个方面。以下是对这些媒体资源的详细归纳&#xff1a; 一、参会媒体 本地主流媒体&#xff1a;如无锡日…

Vue 项目开启 gzip

1. 压缩方式&#xff1a; 在 Nginx 开启压缩&#xff1a;当浏览器发起请求时&#xff0c;服务端对传输资源进行实时压缩&#xff0c;然后返回给浏览器&#xff1b;前端配置打包压缩并在服务端加上支持 gizp 的配置&#xff1a;当浏览器请求时&#xff0c;服务端直接将压缩资源…