Swagger API提交数据的存储路径及配置位置咨询
问题背景
我通过Swagger Editor创建了一个API,生成Node.js服务器并部署到服务器上:
- 将端口配置为8499而非默认的80
- 禁用CORS以实现自通信
- 访问
127.0.0.1:4899/docs进入Swagger UI,使用示例进行数据恢复测试可正常运行
遇到的问题
当我创建一个JSON对象时,接口返回状态码201,提示资源访问路径会在响应头的Location字段中返回,但实际响应头如下:
connection: keep-alive content-type: application/json date: Mon, 13 May 2024 11:41:42 GMT keep-alive: timeout=5 transfer-encoding: chunked x-powered-by: Express
响应内容为:
{ "status": "201", "description": "The resource was created. The Response Location HTTP header should be returned to indicate where the newly created resource is accessible.", "more_info": "" }
我的疑问是:
- 这个JSON对象存储在哪里?
- 能否配置其存储位置以便后续检索?
已做尝试
我已在app.js中添加以下参数尝试启用持久化:
// swaggerRouter configuration var options = { routing: { controllers: path.join(__dirname, './controllers'), cors:false, tryItOutEnabled:true, persistAuthorization:true }, };
解决方案
1. 当前JSON对象的存储位置
Swagger Editor生成的默认Node.js服务器(基于Express)默认没有持久化存储——你创建的JSON对象只存在于内存中,服务器重启后就会丢失。这也是响应头里没有Location字段的原因:默认控制器代码只是模拟了创建成功的响应,并没有实际存储资源,自然无法返回可访问的路径。
2. 如何配置存储位置并实现持久化
要实现持久化存储并返回正确的Location头,需要修改自动生成的控制器代码,并添加存储层:
步骤1:选择存储方案
可根据需求选择:
- 文件存储(用
fs模块写入本地JSON文件) - 数据库存储(比如SQLite、MongoDB等轻量数据库)
步骤2:修改控制器代码
找到./controllers目录下对应创建接口的文件(比如DefaultController.js),修改其中的创建接口逻辑:
- 添加存储逻辑,将JSON对象保存到你选择的存储介质中
- 生成资源的唯一标识(比如ID),构造可访问的URL作为Location头返回
示例(用本地JSON文件存储):
const fs = require('fs'); const path = require('path'); const storagePath = path.join(__dirname, '../data/resources.json'); // 初始化存储文件 if (!fs.existsSync(storagePath)) { fs.writeFileSync(storagePath, JSON.stringify([])); } exports.createResource = function(req, res) { // 获取请求中的JSON对象 const newResource = req.body; // 添加唯一ID newResource.id = Date.now().toString(); // 读取现有数据并添加新资源 const resources = JSON.parse(fs.readFileSync(storagePath)); resources.push(newResource); fs.writeFileSync(storagePath, JSON.stringify(resources)); // 构造Location头 const location = `${req.protocol}://${req.get('host')}/api/resources/${newResource.id}`; res.setHeader('Location', location); // 返回201响应 res.status(201).json({ status: "201", description: "资源已创建", resourceId: newResource.id }); };
步骤3:添加对应的查询接口
为了后续检索,需要在Swagger API定义中添加根据ID查询资源的接口,然后在控制器中实现读取存储介质并返回资源的逻辑。
关于你添加的配置参数
你在app.js中添加的persistAuthorization只是用来持久化Swagger UI中的授权信息,和资源的持久化存储无关;tryItOutEnabled是控制Swagger UI的"Try it out"功能开关,也不影响存储逻辑。
内容的提问来源于stack exchange,提问作者Carlos Maldonado
相关产品推荐
相关产品推荐

