npm 包express-send-stream使用教程

阅读时长 7 分钟读完

npm包“express-send-stream”是用于向Node.js Express应用程序响应发送大文件的中间件。

当我们需要从服务器提供大文件时, 直接将文件作为响应发送进行传输,会导致内存耗尽或服务器挂掉。这时,我们就需要使用流stream技术或分片发送的方法来减少内存占用。

Express-send-stream使用了流stream技术,让应用程序减少内存使用,并将文件内容作为流提供给响应。此外,它还可以轻松地将Gzip压缩、文件名、文件类型、文件缓存头和自定义头等信息添加到响应。

这篇文章将会介绍npm包"express-send-stream"的主要功能,讨论一些使用它的例子,并提供代码示例和教程。

安装 express-send-stream

要使用express-send-stream npm包,先安装它。可以在终端中使用npm安装器进行安装,命令如下:

当应用中需要使用这个包时,可以在文件顶部导入,如下所示:

express-send-stream基本用法

一旦安装和导入express-send-stream,就可以将一个文件流作为响应发送给客户端。

在上面的代码中,我们将文件名和options对象传递给res.sendFile() . 在options中,我们可以为响应添加Gzip压缩,缓存和头信息。如果指定了Gzip压缩,则会自动压缩文件。下面是options的示例:

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

使用express-send-stream发送大文件

如果要发送大文件,则需要使用express-send-stream的stream方式。

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

在上面的代码中,我们创建一个可读流并将其传递给sendStream。express-send-stream将从流读取文件并将其发送给客户端。

为express-send-stream添加请求头

使用express-send-stream可以轻松地添加请求头,帮助您更好地控制响应。

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

要添加请求头,您只需将键和值添加到对象中,该对象将作为options中的headers字段。例如,我们添加Content-Type和Content-Disposition请求头,如上所示。

让请求url和文件名相匹配

在客户端的浏览器中,如果URL和文件名不一致,该文件将不会从服务器下载。但是,在Node.js中使用Express时,可以使用res.download() :res.download(filepath [, filename] [, callback]),它将下载指定的文件。

在客户端通过点击链接来请求此路由,如果url中的文件名不同于'example.zip',则浏览器会调用该文件,但是会响应错误。

为了解决这个问题,我们可以使用express-send-stream发送文件,并在URL和文件名之间建立对应关系,以避免误解。

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

在上面的代码中,我们指定了路由中的参数以表示文件名,因此能够通过const fileName = req.params['name'] || 'example.zip';来捕获文件名。然后,我们将其用于Content-Disposition header 中。

总结

express-send-stream是Express应用程序中发送大文件的好方法,因为它使用了流stream技术,支持轻松Gzip压缩、文件名、文件类型、文件缓存头和自定义头等。它可以让您更好地控制响应,并防止内存泄漏和服务器挂掉。

访问官方文档以获得更多信息和例子示意。

参考资料: express-send-stream documentation express sendfile vs streams Node.js Streams - Everything you need to know

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

纠错
反馈