Logo
Section 1 / 3

读取文件

让我们实现必要的端点,以从服务器获取上传的文件。

导入

读取文件

让我们实现必要的端点,以从服务器获取上传的文件。

在本节课中,我们将实现使 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

业务逻辑

更新和删除文件