导入
读取文件
让我们实现必要的端点,以从服务器获取上传的文件。
在本节课中,我们将实现使 Web 应用程序能够执行用户所期望的基本操作的关键接口。回顾一下,这些基本操作被称为 CRUD(创建、读取、更新和删除)操作。
我们已经实现了创建操作,即文件上传功能。现在,我们将实现必要的读取接口。
- 获取某个用户上传的所有文件。
- 根据文件 ID 获取某个用户上传的特定文件。
- 根据文件名称搜索某个用户上传的文件。
获取所有文件
为了获取所有文件,我们需要确保以下两点:
- 用户必须经过身份验证,以防止未登录用户查看他人的文件。
- 每个用户只能获取自己的文件,不能访问其他用户的文件。
我们可以按如下方式实现这些需求:
1// back-end/controllers/file.js 2 3// ...其余代码 4 5exports.getAll = async (req, res) => { 6 try { 7 const { createdBy } = req.params; 8 9 const allFiles = await File.find({ createdBy: createdBy }); 10 res 11 .status(200) 12 .json({ message: "文件获取成功", data: allFiles }); 13 } catch (err) { 14 console.log(err); 15 return res.status(500).send(err.message); 16 } 17};
createdBy 参数是一个路径参数,用于获取与特定用户相关的文件。
获取特定文件
要获取某个用户创建的特定文件,我们需要与 getAll 接口相同的前提条件,并且还需要提供文件的 ID。
我们可以这样实现获取逻辑:
1// backend/controllers/file.js 2 3// ...其余代码 4 5exports.getFile = async (req, res) => { 6 try { 7 const { createdBy, fileId } = req.params; 8 9 const file = await File.findOne({ _id: fileId, createdBy: createdBy }); 10 11 if (!file) { 12 return res.status(404).send("请求的文件不存在"); 13 } 14 15 res 16 .status(200) 17 .json({ message: "文件获取成功", data: file }); 18 } catch (err) { 19 console.log(err); 20 return res.status(500).send(err.message); 21 } 22};
我们添加了 fileId 参数以便定位具体文件。如果数据库中不存在该文件,则返回错误。404 状态码表示请求的资源不存在。
搜索文件
我们可以实现一个接口,根据文件的名称、描述、创建时间或其他模型中定义的属性进行搜索。只需将查询字符串传递给该接口,即可按如下方式实现:
1// backend/controllers/file.js 2 3// ...其余代码 4 5exports.searchFiles = async (req, res) => { 6 try { 7 const filter = {}; 8 9 if (req.query.name) filter.name = new RegExp(req.query.name, 'i'); 10 if (req.query.description) filter.description = new RegExp(req.query.description, 'i'); 11 if (req.query.createdAt) filter.createdAt = req.query.createdAt; 12 13 const files = await File.find(filter); 14 15 res 16 .status(200) 17 .json({ message: "文件获取成功", data: files }); 18 } catch (err) { 19 console.log(err); 20 return res.status(500).send(err.message); 21 } 22};
我们实现了基于名称、描述和创建时间的搜索功能。名称和描述使用正则表达式匹配,模式会查找相似记录而非完全一致的条目。创建时间则为精确匹配,不使用正则表达式。
路由配置
最后,我们需要将上述接口路由到对应的处理逻辑中,使其能够正常工作。
1// backend/routes/index.js 2 3// ...其余代码 4 5router.get("/file/:createdBy", auth, fileController.getAll); 6 7router.get("/file/:createdBy/:fileId", auth, fileController.getFile); 8 9router.get("/file", auth, fileController.searchFiles); 10 11// ...其余代码
以下是上述代码的说明:
- 第一个路由接收
createdBy作为路径参数。 - 第二个路由接收
createdBy和fileId两个路径参数。 - 第三个路由是通用接口,可接受任意查询字符串。
- 使用认证中间件确保未登录用户无法访问文件。
测试读取接口
我们可以使用 Postman 来测试已实现的接口,如下所示:
No configuration found for ID: 51446bb67aae65c616d01497d152145c2a2f60c46fa2a130eb661e3ca16957fd