2026-01-21 13:34:42 +08:00
|
|
|
|
根据约束,帮我写一个nodejs的后端项目。这个项目需要实现以下的功能:
|
|
|
|
|
|
1,调用其他项目的API,是一个升级接口,等待返回。返回以后执行下一步。
|
|
|
|
|
|
2,有返回值以后,等待45秒,调用第二个API,获取到一个升级是否成功的状态(如果调用失败或者返回空,则在5分钟之内,每30秒调用一次,直到成功或者超时)。
|
|
|
|
|
|
3,把上述所有信息,记录到日志数据库中(需要创建一个日志数据库和时序日志表)。
|
|
|
|
|
|
4,项目需要用pm2部署,需要在项目根目录下创建一个pm2.json文件,配置好启动参数。
|
|
|
|
|
|
5,项目需要在.env文件,配置好所有的环境变量和升级参数。
|
|
|
|
|
|
6,项目需要创建一个test_upgrade数据库,数据库中需要有一个upgrade_log表,用于记录升级日志。
|
|
|
|
|
|
7,需要一个定时器,每隔10分钟(时间需要通过env配置文件修改),调用升级接口。这里注意,配置文件需要特殊设计,因为可能需要同时对多个主机分多组进行升级,每组主机的升级时间也可能是不同的,需要根据实际情况进行配置,roomtype_id应当是数组,一个roomtype_id应当对应一组host_list_str,每个host_list_str也应当是数组,一组host_list_str对应2个fileName,这里注意,2个fileName是因为,每一个版本需要连续升级2次,然后切换另一个版本,再升级两次,再切换版本,以此类推。每次升级,最小升级单位是roomtype_id,多个roomtype_id的情况下,分别使用每一个roomtype_id和他对应的host_list_str以及fileName,来调用接口进行下发。你需要设计好配置文件的结构,并且给出一个案例。
|
|
|
|
|
|
|
|
|
|
|
|
环境:
|
|
|
|
|
|
Windows server 2022
|
|
|
|
|
|
nodejs 24.10.0
|
|
|
|
|
|
pm2 部署
|
|
|
|
|
|
|
|
|
|
|
|
升级接口:
|
2026-01-21 17:02:20 +08:00
|
|
|
|
https://www.boonlive-rcu.com/api/Upgrade_V2
|
2026-01-21 13:34:42 +08:00
|
|
|
|
Post方法,form表单
|
|
|
|
|
|
参数:
|
|
|
|
|
|
roomtype_id=2 释义:房型编号(目前固定值,需要通过env配置文件修改)
|
|
|
|
|
|
host_list_str=[1,2,3] 释义:主机 编号ID (目前固定值,需要通过env配置文件修改)
|
|
|
|
|
|
fileName=1.bin 释义:固件的名字 (目前固定值,需要通过env配置文件修改)
|
|
|
|
|
|
返回值:
|
2026-01-21 17:02:20 +08:00
|
|
|
|
{"IsSuccess":true,"Message":"升级中"} IsSuccess释义:是否成功,成功返回true,失败返回false Message 释义:返回信息
|
2026-01-21 13:34:42 +08:00
|
|
|
|
|
|
|
|
|
|
查询升级完成接口:
|
|
|
|
|
|
https://www.boonlive-rcu.com/api/QueryUpdateHostProgressBar
|
|
|
|
|
|
post方法,form形式
|
|
|
|
|
|
参数:
|
|
|
|
|
|
HostIDList=[1,2,3] 释义:主机 编号ID (目前固定值,需要通过env配置文件修改,等同于升级接口的host_list_str)
|
|
|
|
|
|
返回值:
|
|
|
|
|
|
{
|
|
|
|
|
|
"IsSuccess": true,
|
|
|
|
|
|
"Response": [ // 升级状态列表,每个对象组是HostIDList中的一个主机的升级状态
|
|
|
|
|
|
{
|
|
|
|
|
|
"HostID": 12345, // 主机编号ID
|
|
|
|
|
|
"Upgrade_status": "升级就绪", // 升级状态(枚举值:升级就绪,升级完成,升级失败,开始下载,下载中,下载完成,校验中,校验完成,RCU升级中,超时失败)
|
|
|
|
|
|
"Upgrade_DateTime": "2026-01-20 09:18:57", // 升级时间(格式:yyyy-MM-dd HH:mm:ss)
|
|
|
|
|
|
"UpgradeFileType": "固件升级", // 升级文件类型(枚举值:固件升级,配置升级)
|
|
|
|
|
|
"FileBlockTotalCount": 100, // 总块数
|
|
|
|
|
|
"FileCurrentNumber": 25, // 当前块数
|
|
|
|
|
|
"BaiFenBi": "25%", // 升级进度(百分比)
|
|
|
|
|
|
"FileName": "firmware_v1.2.bin", // 升级文件名
|
|
|
|
|
|
"Version": "1.2.0", // 固件版本号
|
|
|
|
|
|
"ConfiguraVersion": "2.1.0" // 配置版本号
|
|
|
|
|
|
}
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
上述内容里,需要记入数据库的字段有:
|
2026-01-21 17:02:20 +08:00
|
|
|
|
-1,开始升级时间(初次调用Upgrade_V2接口时间,格式:yyyy-MM-dd HH:mm:ss)
|
2026-01-21 13:34:42 +08:00
|
|
|
|
-2,roomtype_id (升级的房型编号)
|
|
|
|
|
|
-3,host_str (升级的主机编号ID列表)
|
|
|
|
|
|
-4,fileName (升级的文件名)
|
|
|
|
|
|
-5,升级状态(成功或失败)
|
|
|
|
|
|
-6,查询到完成升级(或者升级失败)的时间(记录5分钟内最后一次返回值的Upgrade_status时间,格式:yyyy-MM-dd HH:mm:ss;若所有对象Upgrade_status都为升级完成或超时失败则直接结束,不需要等待5分钟)
|
|
|
|
|
|
-7,升级文件类型(固件升级或配置升级)
|
|
|
|
|
|
-8,配置版本号
|
|
|
|
|
|
-9,固件版本号
|
|
|
|
|
|
-10,其他你认为必要的字段
|
|
|
|
|
|
而且,不是每次调用这个查询接口都写库,只记录5分钟内最后一次返回值的Upgrade_status字段到status里;如果所有对象的Upgrade_status都为升级完成或超时失败,则直接结束,不需要等待5分钟。
|
2026-01-21 17:02:20 +08:00
|
|
|
|
例如:调用接口:参数:roomtype_id=2,host_list_str=[1,2,3]。写库3行,分别host_str是1,2,3。然后调用接口QueryUpdateHostProgressBar:参数:roomtype_id=2,HostIDList=[1,2,3]。返回值里,Response里的Upgrade_status字段为升级完成的那次调用里的信息,记录到数据库,(逐个记录,例如1为升级成功,其余两个无记录,则先记录1,等2升级成功,再记录2,以此类推)。这里需要用uuid来确保是同一次调用。每次调用Upgrade_V2,都应该创建新的数据库行数据。
|
2026-01-21 13:34:42 +08:00
|
|
|
|
|
|
|
|
|
|
另外
|
|
|
|
|
|
需要把 https://www.boonlive-rcu.com/api 作为一个常量,放在env配置文件中。
|
|
|
|
|
|
|
|
|
|
|
|
链接需要用到的PGSQL的字符串配置的env,我已经放在了.env文件中。其他配置字段需要你根据实际情况添加。
|