Firebase Functions搭配Express出现%CO参数解码失败如何捕获?
问题原因
Firebase Cloud Functions 在请求到达你的 Express 实例之前,会先完成 URL 解码逻辑,一旦遇到无效编码触发 URIError,会直接返回 400 响应,请求根本不会进入你定义的 Express 错误处理中间件,因此原生 Express 下生效的错误捕获逻辑在该场景下失效。
解决方案
在 Express 实例外新增一层请求包装逻辑,提前尝试解码 URL 路径并捕获错误,即可实现自定义跳转逻辑:
const functions = require('firebase-functions'); const express = require('express'); const app = express(); app.get('**', (req, res) => res.send('working')); // 原有错误中间件可保留,处理其他业务错误 app.use((err, req, res, next) => res.redirect('/404')); // 新增包装函数提前捕获解码错误 const handleRequest = (req, res) => { try { decodeURIComponent(req.path); // 解码正常则交给Express处理 app(req, res); } catch (err) { // 捕获到URI解码错误直接跳转 if (err instanceof URIError) { return res.redirect('/404'); } // 其他类型错误继续抛出 throw err; } } exports.app = functions.https.onRequest(handleRequest);
验证方式
本地执行 firebase serve --only functions 启动测试服务,访问 http://localhost:5000/%CO 即可正常跳转到404页面。
内容的提问来源于stack exchange,提问作者Lucem
相关产品推荐
相关产品推荐

