我有两条路线。
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上按文件名获取文件