You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NodeJS调用Grafana Delete API无法删除仪表盘求助

Grafana删除仪表盘API NodeJS调用失效问题解决

问题描述

通过Postman调用Grafana删除仪表盘API(grafana_host_url/api/dashboards/uid/:uid)可成功删除仪表盘,但使用NodeJS代码调用时,返回状态码200,响应体为仪表盘详情数据(而非预期的删除成功响应),且仪表盘仍存在于Grafana实例中。

问题代码

function deleteGrafana(req) {
    return new Promise((resolve, reject) => {
        console.log("Inside Delete Grafana")
        var dashbord_api_url = req.grafana_host_url + process.env.GRAFANA_DASHBOARD_DELETE_API_URL + req.uid
        var api_token = "Bearer " + req.grafana_api_key
        console.log("URL:",dashbord_api_url)
        console.log("api token:",api_token)
        var callOptions = {
            'method': 'DELETE',
            'url': dashbord_api_url,
            'headers': {
                'Accept': 'application/json',
                'Content-Type': 'application/json',
                'Authorization': api_token
            }
        };
        request.get(callOptions, (error, response) => {
            if (error) {
                throw new Error(error)
            }
            console.log("deleteGrafana Response" + response.body);

            var result = {};
            result.status = response.statusCode
            console.log("Result Status code:",result.status)
            resolve(result)
        });
    });
}

代码执行响应

deleteGrafana Response{"meta":{"type":"db","canSave":true,"canEdit":true,"canAdmin":true,"canStar":true,"canDelete":true,"slug":"sampletest","url":"/d/najkl-oo/sampletest","expires":"0001-01-01T00:00:00Z","created":"2022-12-29T11:43:00Z","updated":"2022-12-29T11:43:01Z","updatedBy":"Anonymous","createdBy":"Anonymous","version":2,"hasAcl":false,"isFolder":false,"folderId":0,"folderUid":"","folderTitle":"General","folderUrl":"","provisioned":false,"provisionedExternalId":"","annotationsPermissions":{"dashboard":{"canAdd".....

预期删除成功响应

{
  "id": xx,
  "message": "Dashboard deleted",
  "title": "sample test"
}

原因分析

代码存在核心错误:尽管在callOptions中指定了method: 'DELETE',但实际调用的是request.get()方法。该方法会强制发送GET请求,忽略配置中的method参数,导致实际执行的是获取仪表盘详情的接口(GET /api/dashboards/uid/:uid),而非删除接口,因此返回仪表盘元数据,且不会触发删除操作。

解决方案

将request.get()替换为request()或request.delete(),确保发送DELETE请求:

修改后的代码

function deleteGrafana(req) {
    return new Promise((resolve, reject) => {
        console.log("Inside Delete Grafana")
        var dashbord_api_url = req.grafana_host_url + process.env.GRAFANA_DASHBOARD_DELETE_API_URL + req.uid
        var api_token = "Bearer " + req.grafana_api_key
        console.log("URL:", dashbord_api_url)
        console.log("api token:", api_token)
        var callOptions = {
            'method': 'DELETE',
            'url': dashbord_api_url,
            'headers': {
                'Accept': 'application/json',
                'Authorization': api_token
            }
        };
        // 使用request()方法,会遵循配置中的method参数
        request(callOptions, (error, response) => {
            if (error) {
                reject(error)
                return
            }
            console.log("deleteGrafana Response" + response.body);

            var result = {};
            result.status = response.statusCode
            result.body = JSON.parse(response.body)
            console.log("Result Status code:", result.status)
            resolve(result)
        });
    });
}

额外优化点

  • 删除不必要的Content-Type请求头,DELETE请求通常无需设置该字段
  • 改用reject(error)处理错误,符合Promise的错误处理规范
  • 将响应体解析为JSON格式,便于后续业务逻辑处理

内容的提问来源于stack exchange,提问作者raghavginfocus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 00:50:32