Express JS - 静态图像无法使用 res.redirect 加载

问题描述 投票:0回答:1

我有从公共文件夹提供的静态图像。如果我有

const getSomeController = (req, res, next) => {
    res.send(htmlFunction)
}

const postSomeController = (req, res, next) => {
    res.redirect('/path/to/getSomeController)
}

如果我通过 GET 请求访问 URL,图像将始终加载。如果我使用 post 请求,在请求结束时它会重定向到 GET 控制器,则页面上不会加载任何静态图像。但是,不在文件系统上的图像(例如来自另一个网站的图像)将立即加载。

我已经在 FireFox/Chrome/Edge 上测试过它,行为上有差异。
本地主机上的 Firefox 会限制页面,即使关闭了限制,这也会延迟响应,并且 Firefox 会加载图像。
Chrome/Edge 立即导航到该页面并最终得到以下响应:

(failed)net::ERR_EMPTY_RESPONSE

如果您向 Chrome/Edge 添加节流功能,它将加载图像。
如果您添加 Fast 4G,它将加载图像,但在重定向和加载新 URL 之前,将加载一个白色页面,没有 UI 表明服务器尚未发送响应
如果您添加 Slow 4g,它会在重定向之前停留在当前页面,这是更好的体验,因为您不会在浏览器中看到表明未发送响应的白页。

图像从公共文件夹的子文件夹“images”中提供,如下所示

app.use(express.static(path.join(import.meta.dirname, 'public')));

图像的路径保存为绝对路径,如下所示

/images/filename.png

FS上的目录是这样的

public/images/filename.png

网络工具中的请求发起者链以
结尾

http://localhost:3000/images/filename.png

回顾一下,使用 res.send 时没有问题。
无法在 res.redirect 上工作,除非您限制浏览器以减慢速度,否则 Firefox 会自动限制,因此它始终可以工作。

更改标头/限制浏览器/
在谷歌上找不到对此的参考。
人工智能在这件事上毫无用处。
我不想用 res.send 的副本以及要发送的整个函数和变量来替换重定向,因为 res.redirect 使事情变得更简单,但如果它会出现这个致命问题,则不会。

node.js express http-redirect static response.redirect
1个回答
0
投票

限制之所以有用,部分原因是当您使用服务器端重定向 (res.redirect()) 时,浏览器会立即停止处理当前请求,并为重定向的 URL 启动一个新请求。此行为可能会导致待处理的资产请求(如图像)被取消或未完全处理,特别是如果重定向发生得太快。

如果您需要保留 302 重定向,我宁愿将重定向移至前端并直接与浏览器一起工作,这样可以比此处的服务器端重定向更好地等待资源。

调用您的 POST 端点从客户端接收响应和重定向。 如果这解决了问题请告诉我

© www.soinside.com 2019 - 2024. All rights reserved.