Express.js中如何将剩余URL路径全部映射为单个参数?
实现方法
第一步:修改路由定义
Express 默认的路由参数匹配不会识别路径中的斜杠,只会匹配到下一个斜杠之前的内容,只需要将路由参数改为通配符匹配模式,就可以捕获/api/photo/之后包含斜杠的所有路径内容。
将原有路由代码:
app.get('/api/photo/:S3ObjectKey', photo.get);
替换为:
app.get('/api/photo/:S3ObjectKey(*)', photo.get);
第二步:直接复用原有逻辑
修改路由后不需要调整photo.get内的处理代码,req.params.S3ObjectKey会直接返回完整的路径值,示例请求中就能拿到bucketMyPhoto/2020/07/12/home/table.jpeg。
安全优化建议
由于现在会接收任意路径作为参数,建议新增路径校验规则,防止恶意用户构造../../../sensitive/file这类相对路径遍历S3桶内非公开文件:
const S3ObjectKey = req.params.S3ObjectKey; // 新增相对路径拦截逻辑 if (S3ObjectKey.includes('..')) { return res.status(400).send('Invalid file path'); } // 原有后续逻辑保持不变 if (!S3ObjectKey) { console.log("No S3ObjectKey specified"); return res.status(400).send("Missing S3 object key"); } console.log("S3ObjectKey: ", S3ObjectKey); const canShow = true; if (canShow) { const bucket_name = process.env.AWS_S3_BUCKET_NAME; const data = await S3.getFile(bucket_name, S3ObjectKey); data.Body.pipe(res); }
内容的提问来源于stack exchange,提问作者Kid_Learning_C
相关产品推荐
相关产品推荐

