Swagger调用Express+Firebase API遇CORS及Firestore值错误求助
问题分析与解决步骤
1. 修正Swagger服务器配置(解决请求地址错误/跨域)
你的swagger.js中服务器配置和本地服务不匹配,这是导致Swagger请求失败的核心原因之一:
- 本地服务端口为
8080(或环境变量指定端口),但配置中写了8081 - 本地开发通常用
http而非https(除非你配置了本地SSL证书) host: "/"是无效配置,直接移除即可
修改swagger.js的servers段:
servers: [ { url: "http://localhost:8080/menusapi/api/v1/", // 匹配你的本地服务端口和路由前缀 }, ], // 删除host字段
2. 调整CORS配置(适配Swagger UI请求)
当前CORS配置仅允许http://localhost:${port}的请求,虽然Swagger UI页面本身就在这个地址下,但如果后续有端口变动或其他场景,建议改成更灵活的判断逻辑:
app.use( cors({ origin: (origin, callback) => { // 允许本地请求(包括Swagger UI和Postman) if (!origin || origin.startsWith('http://localhost')) { callback(null, true); } else { callback(new Error('CORS不允许该来源')); } }, methods: ["GET", "POST", "DELETE", "PUT", "PATCH"], credentials: true, }) );
3. 修复Firestore的undefined参数错误
控制台抛出的Cannot use "undefined" as a Firestore value错误,是因为登录接口的请求参数缺失,导致传给Firestore的查询约束为undefined。原因是Swagger注释没有正确定义请求体参数,导致界面发起请求时未传递必填字段。
在auth_controller.js的login方法中补充请求体的Swagger注释:
exports.login = async (req, res) => { /* #swagger.tags = ['Auth'] #swagger.description = '用户登录接口'; #swagger.summary = "用户登录到应用"; #swagger.security = [{ "bearerAuth": [] // 登录接口无需提前携带token,建议用bearerAuth或移除security配置 }] #swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/definitions/Login" } // 引用你定义的Login Schema } } } #swagger.responses[200] = { description: '登录成功', schema: { "message": "登录成功!", "jwt": "一串长令牌", "refresh_jwt": "另一串长令牌" } } */ // 业务代码中先校验参数是否存在 const { email, password } = req.body; if (!email || !password) { return res.status(400).json({ message: "邮箱和密码不能为空" }); } // 后续Firestore查询逻辑,确保传递的参数均为有效值 };
4. 重新生成Swagger文档
修改完注释后,重新运行swagger-autogen命令生成最新的swagger.json,确保Swagger界面能正确渲染必填参数输入框。
5. 验证请求流程
启动服务后,在Swagger界面的登录接口中填写完整的请求体参数(如邮箱、密码),再发起请求,检查是否解决错误。
内容的提问来源于stack exchange,提问作者Sulac
相关产品推荐
相关产品推荐

