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

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": ""
} 

我的疑问是:

  1. 这个JSON对象存储在哪里?
  2. 能否配置其存储位置以便后续检索?
已做尝试

我已在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 08:15:55