Node.js如何发送带JSON请求体的PATCH请求操作Atlas集群
Node.js 实现MongoDB Atlas API暂停集群操作
核心注意事项
- MongoDB Atlas v2 API 强制要求Digest认证,不支持普通的Basic Auth,不要自行手写Digest签名逻辑,直接使用成熟的带Digest认证支持的HTTP客户端即可避免90%的认证报错
- 调用修改集群接口必须携带指定版本的Accept头,否则会直接返回406错误
paused字段需传入布尔值,true触发暂停,false触发恢复,不要传字符串类型的"true"- 用于调用的API密钥需要绑定对应项目的
Cluster Manager权限,同时把运行脚本的机器出口IP加入密钥的IP白名单 - 仅M10及以上规格的付费集群支持通过API暂停,M0免费集群不支持该操作
可直接运行的实现代码
首先安装依赖:
npm install axios @mhoc/axios-digest-auth
脚本代码:
const axios = require('axios'); const DigestAuth = require('@mhoc/axios-digest-auth').default; // 替换为你自己的账号信息 const AUTH_CONFIG = { publicKey: "替换为你的Atlas API公钥", privateKey: "替换为你的Atlas API私钥", groupId: "替换为集群所属的项目ID(Group ID)", clusterName: "替换为要操作的集群名称", apiEndpoint: "https://cloud.mongodb.com" }; const digestClient = new DigestAuth({ username: AUTH_CONFIG.publicKey, password: AUTH_CONFIG.privateKey }); async function setClusterPausedStatus(isPaused) { try { const response = await digestClient.request({ method: "PATCH", url: `${AUTH_CONFIG.apiEndpoint}/api/atlas/v2/groups/${AUTH_CONFIG.groupId}/clusters/${AUTH_CONFIG.clusterName}`, headers: { "Content-Type": "application/json", // 注意这个版本头不能漏,指定使用2023-02-01版本的API "Accept": "application/vnd.atlas.2023-02-01+json" }, data: { paused: isPaused } }); console.log("请求提交成功,集群当前状态:", response.data.stateName); // 集群状态变更是异步操作,如需等待操作完成可轮询该GET接口判断paused字段值 return response.data; } catch (error) { console.error("请求失败,错误信息:", error.response?.data || error.message); throw error; } } // 调用示例:暂停集群 setClusterPausedStatus(true); // 如需恢复集群,传false即可 // setClusterPausedStatus(false);
常见报错排查
- 返回401:优先检查公钥、私钥是否复制正确,有没有多余空格,确认使用的是Digest认证而非Basic Auth
- 返回403:检查API密钥权限是否足够,当前IP是否加入密钥白名单
- 返回404:检查项目ID、集群名称是否拼写正确,接口路径是否漏写
- 返回406:检查是否携带了要求的版本号Accept头
内容的提问来源于stack exchange,提问作者user11450789
相关产品推荐
相关产品推荐

