如何用相同的参数提取两条get路线



我有两条路线。

app.get('/api/v1/bucket/:bucket_name', (req, res) => {
queries.getAllFilesFromSpecificBucket(req.params.bucket_name).then(data => {
res.json(data);
});
})
app.get('/api/v1/bucket/:file_name', (req, res) => {
queries.getSpecificFileByName(req.params.file_name).then(data => {
res.json(data);
});
})

除了参数名称之外,他们两个的路径是相同的api/v1/bucket/。这里我的问题是,当我尝试获取带有file_name参数的路由时,总是被调用为带有bucket_name参数的第一个路由。请帮助

简单的答案是只更改一个api路由。另一种选择是组合路线并使用查询参数

app.get('/api/v1/bucket/:name', (req, res) => {
if (req.query.bucket === "true") {
//DO bucket logic
} else {
// DO file logic
}
})

要做到这一点,你需要将你的前端路线更新为类似的东西

const getBucket = `/api/v1/bucket/${bucketName}?bucket=true`
const getFile = `/api/v1/bucket/${fileName}?bucket=false` // NOTE you can just remove the ?bucket=false from this line

如果您的bucketname中没有.,并且文件名始终具有扩展名,则这可能会起作用

app.get('/api/v1/bucket/:name', (req, res) => {
const name = req.params.name;
if (name.includes(".")) {
queries.getSpecificFileByName(name).then(data => {
res.json(data);
});
} else {
queries.getAllFilesFromSpecificBucket(name).then(data => {
res.json(data);
});
}
})

该代码将检查:name是否有.,如果有,则将逐个文件名获取文件,如果没有,则将获取存储桶名称内的所有文件

例如:

  • example.jpg->文件
  • .example->文件
  • example->铲斗

但如果你想让它更REST,那么我认为改变你的路由路径更有意义,比如:

  • /api/v1/buckets/:bucketName/files:获取存储桶中的所有文件
  • /api/v1/buckets/:bucketName/files/:fileName:在bucket中按文件名获取文件
  • /api/v1/files/:fileName:在任意bucket上按文件名获取文件

最新更新