HapiJS 是一个用 JavaScript 编写的服务器框架,它旨在提供一个可靠的结构和强大的插件系统来构建 Web 应用程序。HapiJS 的 Request 对象是处理客户端请求的主要组件之一,它允许我们访问请求头、请求体和查询参数等信息。除此之外,HapiJS 的 Request 还内置了文件上传功能,本文将介绍如何在 HapiJS 应用程序中使用 Request 进行文件上传。
请求时的文件上传
首先,我们需要在 HTML 表单中将文件上传到服务器。在表单中加入以下代码:
<form action="/upload" method="post" enctype="multipart/form-data"> <input type="file" name="file" /> <button type="submit">Upload</button> </form>
这里我们使用了 enctype="multipart/form-data"
,表示该表单将上传二进制文件。在表单中,我们只需要为文件选择一个文件输入框,文件的名称为 file
。我们也可以上传多个文件,只需将 file
更改为数组即可。
在 HapiJS 中进行文件上传
我们需要安装 hapi
的 inert
模块来处理静态文件请求。在使用 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.badRequest
和 Boom.unsupportedMediaType
方法,用来返回各自对应的错误状态码和信息。我们还引入了 fs
和 path
这两个 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