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

Swagger+NodeJS+SQLite3中DELETE接口无法调用问题排查

问题:Swagger中DELETE接口点击执行无响应排查

我通过Swagger构建OpenAPI接口,GET、POST方法运行正常,但DELETE方法点击Swagger执行按钮后无任何反应。相关配置与代码如下:

相关代码

index.ts

app.use("/deleteProduct/{id}", deleteProduct);

delete.ts

import { Router } from "express";
import { Database } from "sqlite3";
import database from "./databaseConnection";

const deleteProduct = Router()

function removeProduct(id: string, db: Database) {
  console.log(id);
  return new Promise((resolve, reject) => {
    db.serialize(() => {
      db.run(`DELETE FROM product WHERE product_id = ?`, id, (err) => {
        if (err) {
          reject (err);
        }
        resolve ("Success");
      })
    })
  })
}

deleteProduct.delete("/:id", async (req, res) => {
  try {
    res.json(await removeProduct(req.params.id, database));
  }  catch (err) {
    console.error(`Error removing the product`, err.message);
  }
});

export default deleteProduct

swagger.json片段

"/deleteProduct/{id}": {
      "delete": {
        "tags": ["Delete"],
        "description": "Removes product from database",
        "produces": "application/json",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "description": "Id of the product",
            "required": true,
            "schema": {
                "type": "integer"
            }
        }],
        "responses": {
          "200": {          
            "description": "Product was deleted",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array"
                }
              }
            }
          }
        }
      }
    }

排查与修复方案

  • 路由路径配置错误
    Express路由中路径参数使用:参数名格式,而非Swagger的{参数名}。当前app.use("/deleteProduct/{id}", deleteProduct);会把/deleteProduct/{id}当成固定路径,而delete.ts中又定义了/:id子路由,导致实际路径变成/deleteProduct/{id}/:id,和Swagger的接口路径不匹配。
    修改index.ts:

    app.use("/deleteProduct", deleteProduct);
    

    组合后实际路径为/deleteProduct/:id,与Swagger定义的/deleteProduct/{id}对应(Swagger用{}标识路径参数)。

  • 错误处理未返回客户端响应
    delete.ts的catch块仅打印错误日志,未向客户端返回任何响应,导致Swagger一直处于等待状态。需补充响应返回:
    修改delete.ts的catch部分:

    catch (err) {
      console.error(`Error removing the product`, err.message);
      res.status(500).json({ error: err.message });
    }
    
  • 参数类型不匹配
    Swagger定义id为integer类型,但req.params.id默认是字符串类型,虽然SQLite会自动转换类型,但建议显式转换避免潜在问题:
    修改delete.ts的路由处理函数:

    res.json(await removeProduct(parseInt(req.params.id), database));
    

    同时更新removeProduct的参数类型:

    function removeProduct(id: number, db: Database) { ... }
    
  • Swagger响应定义与实际返回不匹配
    当前Swagger中200响应的schema定义为array类型,但实际代码返回的是字符串"Success",会导致Swagger解析响应异常。修改swagger.json的响应schema:

    "schema": {
      "type": "string"
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 13:12:02