OpenAPI Generator生成JS SDK调用Express接口遇错误求助
问题:OpenAPI生成的SDK在浏览器模块中无法导出DefaultApi
我搭建了一个极简全栈应用测试OpenAPI SDK Generator,已尽可能简化配置但仍遇到导入错误。
项目结构
- api/
- docs/
- index.yaml(OpenAPI规范文件)
- server.js(Express服务端代码)
- docs/
- client/
- src/
- api/(通过OpenAPI生成器生成的SDK目录)
- index.js(客户端测试逻辑)
- index.html(测试页面)
- src/
服务端代码(api/server.js)
const express = require("express") const cors = require("cors") const app = express(); app.use(cors()); app.get("/hi", (req, res) => { res.json({ message: "hi from the server" }); }) app.listen(3000, () => { console.log("server running on port 3000"); })
OpenAPI规范(api/docs/index.yaml)
openapi: 3.0.0 info: title: api description: This serves as a base for other REST API's version: 1.0.0 paths: /hi: get: description: Say hi to the server responses: '200': description: Success content: application/json: schema: type: object properties: message: type: string
SDK生成命令(在client目录执行)
npx @openapitools/openapi-generator-cli generate -i ../api/docs/index.yaml -g javascript -o src/api
客户端测试代码
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <main></main> <script type="module" src="./src/index.js"></script> </body> </html>
src/index.js
import { DefaultApi } from './api/src/index.js'; const api = new DefaultApi('http://localhost:3000'); const testConnection = async () => { console.log("testing connection...") const response = await api.hiGet() const data = await response.json() console.log(data) } testConnection()
报错信息
启动客户端本地服务后,浏览器控制台抛出:
Uncaught SyntaxError: The requested module './api/src/index.js' does not provide an export named 'DefaultApi'
解决方案
检查生成的SDK导出结构
进入client/src/api目录,查看index.js的内容。JavaScript生成器的默认导出可能不是DefaultApi,或者需要从具体文件导入。比如很多版本中,DefaultApi是单独在DefaultApi.js文件中导出的,此时需要修改导入路径:import { DefaultApi } from './api/src/DefaultApi.js';生成ES6兼容的SDK
生成命令中添加参数,确保生成适配浏览器模块系统的代码:npx @openapitools/openapi-generator-cli generate -i ../api/docs/index.yaml -g javascript -o src/api --additional-properties=supportsES6=true,useFetch=truesupportsES6=true:启用ES6模块语法useFetch=true:使用浏览器原生fetch代替axios(避免额外依赖)
修正实例化方式
部分版本的生成器要求通过配置对象传入baseURL,而不是直接传字符串:const api = new DefaultApi({ basePath: 'http://localhost:3000' });检查响应处理逻辑
生成的SDK方法可能已经直接返回解析后的JSON数据,不需要再调用.json():const testConnection = async () => { console.log("testing connection...") const data = await api.hiGet() console.log(data) }
内容的提问来源于stack exchange,提问作者Bram Mortier
相关产品推荐
相关产品推荐

