Swagger+NodeJS+SQLite3中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

