[vercel/next.js]如何更改限额? ${req.url} 的 API 响应超过 4MB。这将导致请求在未来版本中失败。

2024-05-10 129 views
9
您使用的 Next.js 版本是什么?

11.1.0

您如何部署您的应用程序?

其他平台

描述错误

在 API 响应中流式传输大文件时,会在终端上收到此警告。

(此更改首先在 PR https://github.com/vercel/next.js/pull/26831中引入,并在https://github.com/vercel/next.js/pull/26887中修改为 4mb )

API response for /api/... exceeds 4MB. This will cause the request to fail in a future version. https://nextjs.org/docs/messages/api-routes-body-size-limit

但我们没有使用 Vercel。我们根本没有使用AWS无服务器功能。因此发出警告与我们无关。

我担心我们将更新 Next.js 并且我们的文件下载将开始在生产中抛出运行时异常,如 #26831 的措辞

在未来的版本中,这种情况将引发错误。

可能的解决方案)

我建议使用一个配置选项来为 Next.js 的非 Vercel 用户抑制此警告(未来错误)。

另外,我想知道中间件是否会使这个问题不再存在?

我们希望避免启动自定义服务器,但如果需要的话我们会这样做。

回答

8

你好,你能尝试添加一个最小的复制品,让这个问题更容易推理吗?

8
再生产
// pages/api/test-download.js
import crypto from 'crypto'

export default async function (req, res) {
  res.setHeader('Content-Disposition', 'attachment; filename=random.dat');
  // create random buffer 10mb
  res.end(crypto.randomBytes(10 * 1024 * 1024)) // above the current 4mb limit of nextjs
  // can also be reproduced with `ReadableStream.pipe(res)`
}
8

所以这其实是故意的。

在您的用例中,从单个 Next.js 实例发送大文件的性能不高,因为用户可能距离很远或连接中断,因此最好使用专为处理大型资产而设计的 CDN。

错误文档也指出了这一点:

如果您需要支持向客户端发送大文件,则应考虑为这些资产使用专用媒体主机。

https://nextjs.org/docs/messages/api-routes-body-size-limit

4

@balazsorban44,在打开此问题之前,我通读了所有相关文档。我知道这是故意的。

然而,在我们的用例中,这些是私有文件(需要身份验证检查),是大型应用程序中较少使用的功能,并且所有用户都位于同一个国家/地区。因此我们不能证明CDN 是合理的。即使是专门的媒体主持人也太过分了。随着我们的成长,这种情况可能会改变,但不会很快改变。

我们当然可以启动一个自定义服务器,但这似乎是解决繁文缛节的方法。另外,我们将失去这些特定端点的npm run dev 热重载优势。

另一方面,添加配置开关非常容易,许多开发人员都处于像我们这样的用例中,没有人从过度设计中受益。也就是说,直到他们能够将公司发展到更大的规模。

所以,我只是在思考 Next.js 团队添加此限制的动机。您的团队所做的事情在某些用例中是有意义的,但并不适合所有人。我特别担心未来版本中出现的错误。

我的团队很乐意为配置切换创建 PR。你怎么认为?

8

如果能够超越此限制,我的应用程序也会受益匪浅。我们也没有使用无服务器功能,并且可以接受更大的响应负载。我真的很喜欢 Next API,并且不想创建自定义服务器和 Express API。

0

如果能够超越此限制,我的应用程序也会受益匪浅。我们也没有使用无服务器功能,并且可以接受更大的响应负载。我真的很喜欢 Next API,并且不想创建自定义服务器和 Express API。

完全支持,我不使用vercel,不需要限制我的应用程序...请。

6

同样,我的团队很乐意创建一个 PR 来介绍一个next.config.js选项。我只需要知道它将被合并而不是被拒绝。 :)

5

@balazsorban44 请考虑重新提出问题或参与此处的对话。

我也担心这会产生错误。

并非每个人都在使用 Vercel / 云服务,还有一个超越这个世界的世界:我在专用服务器上自行托管,因此我对服务器上的资源使用负全部责任。可以有一个警告告诉我,我对此没有意见。但我想对我的行为承担全部责任,因此:

  • 如果我认为该警告不适用,则可以禁用该警告
  • 如果该功能适合我的用例,仍然可以使用它

特别是因为它是一个易于实施的解决方案,无需全力以赴地使用 CDN,这在很多情况下可能是大材小用。它增加了额外的复杂性和成本,在许多用例中几乎没有收益。

我的个人用例是通过身份验证机制( next-auth )来控制下载。

给你一些数字:

  • 门控文件约为 30MB,在我的情况下每天下载 20000 次(相当于每天约 600GB)
  • 我没有任何性能或 CPU 使用率问题(恰恰相反,它真的很低,恭喜!)。与网络相同。它就像一个魅力一样发挥作用。
  • 我没有抱怨用户下载缓慢或此机制出现问题
  • 网站运行得非常顺利

我同意 @700software 的观点:给我们一种方法来禁用此警告,并禁止或在 Vercel 上做任何您想做的事情以防止它被使用。对每个人都进行限制太宽泛了。

我个人认为您正在 Next.js 中实现面向 Vercel/Cloud 的警告,这不是该限制的地方。

8

@balazsorban44 希望您可以重新打开此问题并允许制作 PR。我不使用 Vercel,并且有一个将大文件流式传输回客户端的用例。

尝试先将大文件加载到内存中或将它们从 S3 移回,对我来说是行不通的。

我们允许用户从 S3(有点像 Dropbox)下载他们的文件夹/文件。当收到文件夹下载请求时,我们从 S3 拉取、创建目录并压缩整个包并将其流式传输回客户端。对于我们来说,获取该 zip、将其推回 S3 并请求预签名 URL 的性能不如流式传输数据那样高效(更不用说它可能会变得昂贵)。

我同意@Tetedeiench 和@700software 的观点,认为应该有一种方法来配置此选项。

5

您好,我认为类似于externalResolver页面配置的禁用此警告的配置是合理的,请注意此警告也与不利用无服务器的部署相关。如果您在 Docker 中托管并且从 API 路由提供文件,这比直接从 CDN 提供服务要差得多,CDN 负责从最靠近用户的位置断开/恢复提供文件。

0

您好,我认为类似于externalResolver页面配置的禁用此警告的配置是合理的,请注意此警告也与不利用无服务器的部署相关。如果您在 Docker 中托管并且从 API 路由提供文件,这比直接从 CDN 提供服务要差得多,CDN 负责从最靠近用户的位置断开/恢复提供文件。

感谢您重新提出问题!事实上,具有身份验证支持的 CDN 可能是最佳选择,但其成本高昂。

就我而言,由于我的应用程序很重(30MB)并且很受欢迎(每天 20,000 次下载),因此 CDN 的成本是毫无疑问的。

我的意思是,对我来说,仅下载量的合适估计是每月 17TB。我以 azure CDN 为例,每月花费 1,335 美元(定价来源:https://azure.microsoft.com/en-us/pricing/details/cdn/)。

使用我自己的服务器带宽和 NextJS API 路由提供服务包含在我自己的私人服务器的托管成本中,总计为 50 美元/月。是的,我负责管理、备份等等……但这对我来说没问题,我已经在做了,而且我的服务器有空闲带宽。

没有人抱怨过下载速度和恢复问题......

@700software 我可能不是那里 PR 的最佳人选,你还愿意吗?

3

我们现在已经订满了,但我肯定会留意这一点。从技术上讲,我们“需要”公关的发生,因此它给了我们一些动力。 ?

3

我认为不必着急 - 这个问题正在重新讨论,我想我们可以放心地打赌这不会在 Nextjs 的未来版本中转化为错误:)

9

4Mb很大吗?谁还在使用 56 kbps 连接?

4

如果我要创建 PR,@700software 和 @Ttedeiench 你们愿意提供一般反馈吗?

6

@crice88 请随意打开包含这些更改的 PR,我们可以打开它来查看!

9

@crice88 非常感谢:)

9

该已关闭的问题已自动锁定,因为它已经一个月没有新活动了。如果您遇到类似问题,请创建一个新问题并包含重现步骤。谢谢。