HapiJS Request 包含的文件上传

阅读时长 7 分钟读完

HapiJS 是一个用 JavaScript 编写的服务器框架,它旨在提供一个可靠的结构和强大的插件系统来构建 Web 应用程序。HapiJS 的 Request 对象是处理客户端请求的主要组件之一,它允许我们访问请求头、请求体和查询参数等信息。除此之外,HapiJS 的 Request 还内置了文件上传功能,本文将介绍如何在 HapiJS 应用程序中使用 Request 进行文件上传。

请求时的文件上传

首先,我们需要在 HTML 表单中将文件上传到服务器。在表单中加入以下代码:

这里我们使用了 enctype="multipart/form-data",表示该表单将上传二进制文件。在表单中,我们只需要为文件选择一个文件输入框,文件的名称为 file。我们也可以上传多个文件,只需将 file 更改为数组即可。

在 HapiJS 中进行文件上传

我们需要安装 hapiinert 模块来处理静态文件请求。在使用 Request 对象处理文件上传前,我们需要进行如下的准备工作:

-- -------------------- ---- -------
----- ---- - ----------------
----- ----- - -----------------

----- ------ - --- -------------
  ----- -----
  ----- -----------
---

------ -- -- -
  ----- -----------------------

  --------------
    ------- ------
    ----- ----------
    -------- --------- -- -- -
      ------ -------------------------------
    -
  ---

  --------------
    ------- -------
    ----- ----------
    -------- --------- -- -- -
      -- ---------
    -
  ---

  ----- ---------------
-----

在这个例子中,我们注册了 inert 并创建了两个路由,一个路由用于显示表单页面,另一个路由则用于处理表单提交请求。

接下来,我们在 /upload 路由的处理程序中,向 Request 对象中添加一个文件上传事件:

-- -------------------- ---- -------
--------------
  ------- -------
  ----- ----------
  -------- --------- -- -- -
    ----- ---- - ----------------

    -- ----------- -
      ----- ---- - ----------

      --------------------- ---- --------------------------------------

      -- ----- ---- -- ----
      -- ------- --------
      ------ ------------------------ -------- ------------------
    -

    ------ -------------- ---- ----------------------
  - 
---

此时,每当触发了 POST /upload 的请求时,HapiJS 就会自动识别请求中是否包含了二进制文件,然后在 Request 对象的 payload 属性中存储这个文件。在上面的代码中,我们通过 request.payload 来访问用户上传的二进制数据(包括表单字段和文件),并且进行了简单的验证和上传文件到服务器的操作。这里我们将文件的相关信息打印在终端中,并返回了一个 HTTP 响应。请注意,当没有文件上传时,我们返回的状态码是 400,这是一种错误状态码。默认情况下,HapiJS 的 Request 在没有指定回应状态码的情况下,会自动设置状态码为 200。

深入学习

Request.payload 属性中的数据是以 Node.js 的 Stream 形式提供的。这意味着,我们可以使用标准的 Node.js 流 API 和库 (如 fs、busboy 等)对上传的文件进行处理。更好的方法是,我们可以安装和使用 HapiJS 的 @hapi/boom 模块提供的 boom 扩展,来处理文件上传过程中可能出现的错误,示例代码如下:

-- -------------------- ---- -------
--------------
  ------- -------
  ----- ----------
  -------- --------- -- -- -
    ----- ---- - ----------------

    -- ------------ -
      ------ ------------------- ---- ------------
    -

    -- ---------------- -------------------------------------------------------------- -
      ------ --------------------------------- ------ - ---- -- --- ----- --------
    -

    ----- ----- - ----------  -- --------- - ---- --
    --------------------- ---- ---------------------------------------

    --- -
      --------------------------------
    - ----- ----- -
      -- --------- --- --------- -
        -----------------
        ----- --------------------- -- ------ -------------
      -
    -

    ----- --------- - -----------------------------------------  -- ------------------- -------
    ----- ---------- - -------------------- -----------
    ----- ---------- - ---------------------------------
    ---------------------- ----- -- -
      -----------------
      ----- --------------------- -- ------ --------
    --

    -----------------------

    ------ ------------------------ -------- ------------------
  -
---

在这个例子中,我们使用了 Boom.badRequestBoom.unsupportedMediaType 方法,用来返回各自对应的错误状态码和信息。我们还引入了 fspath 这两个 Node.js 标准模块来处理文件相关的操作。当产生异常时,我们使用 Boom.internal 方法来捕获错误并返回适当的 HTTP 错误代码。

除了通过事件 request.payload 进行处理,你也可以使用插件 hapi-payload 更加完成的处理 Request 对象。同时,大多数的文件上传操作会使用比 Request 更加专注的工具,如 skipper 或 formidable。

总结

在本文中,我们学习了如何使用 HapiJS Request 对象进行文件上传操作。另外,我们还详细介绍了如何处理文件上传时可能出现的错误情况,并提供了完整的代码示例。

在实际项目中,文件上传通常是一个极其重要的需求,因此深入理解基础的 Request 对象、Node.js 的 Stream API 等都是十分必要的。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6487bfd948841e989464e3fe

纠错
反馈