- 添加升级服务主逻辑,包括定时触发升级、状态查询和日志记录 - 实现数据库初始化脚本和日志表结构 - 添加PM2部署配置文件 - 实现环境变量配置系统 - 添加API客户端模块处理外部接口调用 - 实现升级状态轮询和超时处理机制 - 添加测试用例验证核心功能
5.2 KiB
根据约束,帮我写一个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 部署
升级接口: https://www.boonlive-rcu.com/api/WebChatUpgrade Post方法,form表单 参数: roomtype_id=2 释义:房型编号(目前固定值,需要通过env配置文件修改) host_list_str=[1,2,3] 释义:主机 编号ID (目前固定值,需要通过env配置文件修改) fileName=1.bin 释义:固件的名字 (目前固定值,需要通过env配置文件修改) 返回值: {"IsSuccess":true,"Data":"升级中"} IsSuccess释义:是否成功,成功返回true,失败返回false Data 释义:返回信息
查询升级完成接口: 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" // 配置版本号 } ] }
上述内容里,需要记入数据库的字段有: -1,开始升级时间(初次调用WebChatUpgrade接口时间,格式:yyyy-MM-dd HH:mm:ss) -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分钟。 例如:调用接口:参数: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来确保是同一次调用。每次调用WebChatUpgrade,都应该创建新的数据库行数据。
另外 需要把 https://www.boonlive-rcu.com/api 作为一个常量,放在env配置文件中。
链接需要用到的PGSQL的字符串配置的env,我已经放在了.env文件中。其他配置字段需要你根据实际情况添加。