使用 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 的解决方案感兴趣,如果存在的话。
我在 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 的解决方案感兴趣,如果存在的话。