使用 AXIOS 发送大块 POST 请求时是否可以立即检测到

Is it possible to detect an immediate when sending a chunky POST request with AXIOS

我在 Web 客户端中使用 AXIOS,以便 POST 将文件上传到 express 后端。由于文件大小和客户端用户的带宽都是可变的,因此 POST 请求可能需要一定的时间才能完成。在后端应用一些逻辑,请求立即被拒绝。

问题是客户端只有在请求完成后才会收到响应,这可能是几秒钟。

我已经测试过这不是后端的错,因为当 POSTing 到网络中任意 post-enabled url 时,行为是相同的,无论的技术。这是一个(过度)简化的案例示例。

这是 post 操作。请注意对任意 post-enabled url 的推荐请求。它的行为完全相同:

try{
    console.log("posting....")
    const res = await axios.post("http://localhost:4000/upload", formData)
    // const res = await axios.post("https://github.com/logout", formData)
    console.log("result:")
    console.log(res)
}catch(err){
    console.error(err)
}

以及演示快递后端路线:

app.post("/upload", (req, res) => {
    console.log("Rejecting...")
    res.status(403).send()
    console.log("Rejected.")
    return
})

出于测试目的,我选择了一个 3.7Mb 的文件,并将我的浏览器带宽降低到 Fast 3G 预设。

后端立即输出:

Rejecting... Rejected.

而请求在返回 403 错误之前等待了大约 43 秒:

我是不是遗漏了什么明显的东西?这是一个如此常见的功能,这让我怀疑这是否是正确的处理方式。如果真的是这样,我们是否有关于 express 的线程在那段时间是否处于活动状态的任何信息,还是只是给客户带来的不便?

提前致谢!

我相信你可以只使用 res.status(403) 而不是 res.status(403).send() .

您也可以尝试使用 res.status(403).end() 并且我不确定为什么您应该在路由器部分使用 return 语句。

似乎 first 发送响应头然后 then 手动销毁请求就可以了:

app.post("/upload", (req, res) => {
    console.log("Rejecting...")
    res.status(403).send("Some message")
    return req.destroy()
})

AXIOS 请求保持挂起状态,直到仅上传当前块,然后立即产生正确的状态和消息。在节流的快速 3g 示例中,等待时间从 43 秒减少到 900 毫秒。

此外,这个解决方案是通过反复试验得出的,因此它可能不是最佳实践。

我仍然对面向 AXIOS 的解决方案感兴趣,如果存在的话。