为啥 axios post 方法在连续 6 次 post 调用后停止工作?
Posted
技术标签:
【中文标题】为啥 axios post 方法在连续 6 次 post 调用后停止工作?【英文标题】:Why does axios post method stop working after 6 consecutive post calls?为什么 axios post 方法在连续 6 次 post 调用后停止工作? 【发布时间】:2021-12-15 20:32:14 【问题描述】:我问这个问题是因为我在网上任何地方都找不到这样的问题。
我从 React 应用程序向 mongodb 数据库发布更新,以更新对象的 x 和 y 位置,或对象内的组件(“小部件”)。
这适用于对数据库的“updatePage”进行 6 次发布调用,以添加或删除小部件或移动页面。但是在第 6 次调用之后,它不再接受任何发送到数据库的帖子(React 状态将继续改变,但就好像路由器不再接受任何传入信息一样)。
在我不知道的节点中可以连续发布的帖子数量是否有限制设置? 还是我的代码有问题?我发现我从未收到来自节点路由器的响应调用很不寻常(无论 post 方法是否成功......)。
下面是从 React 端调用 post update 到路由器的代码:
function saveUpdatedPage (update, id)
console.log("updating DB for ",update)
Api.withToken().post('/pageupdate/'+id,
update
).then(function (response)
console.log("post function returned: ",response.data)
).catch(function (error)
console.log("page save failed for some reason: ",error.response);
);
这是路由器中的 post 方法:
router.post('/pageupdate/:_id',auth, async(req,res)=>
console.log("received request to update: ",req.body," id ",req.params);
const filter = "_id": req.params ;
const update = [ $set: req.body ];
let updatedDoc = await Pages.findOneAndUpdate(filter, update, returnNewDocument: true)
);
这里是快速标题设置等...如果它们有帮助的话
const app = express()
app.use(express.json());
app.use(express.urlencoded(extended: true));
app.use(function(req, res, next)
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
next();
);
app.use(userRouter)
app.use(pageRouter)
app.use(express.static(path.join(__dirname, '../front/build')));
这是移动页面 7 次后的控制台(6 次成功发布到数据库,此后没有调用成功)
React 控制台显示页面状态和发送的数据库调用
节点控制台在第 6 个帖子之后停止记录任何帖子
【问题讨论】:
那么您应该发布调用 saveUpdatedPage 函数的逻辑。由于所有这些代码都在工作,我的猜测是问题出在逻辑上。我看不出这个函数是如何被调用的。 【参考方案1】:为什么 axios post 方法在连续 6 次 post 调用后停止工作?
这可能是因为您的原始代码没有向客户端发送任何响应。浏览器对允许对同一主机进行的请求数量有限制。一旦达到该限制,它将请求排队并等待,直到先前的请求之一完成,然后再发送排队的请求。
因此,一旦您将res.send(...)
添加到您的 POST 处理程序(用于成功和错误条件),那么浏览器就不会达到对同一主机的同时请求限制,您可以发送更多请求就好了。
【讨论】:
感谢 jfriend,这很有意义!在这上面花了整整一个下午,结果就是这么简单…… @JohnShanks - 是的,您只需要绝对确保您对每个传入请求都发送响应 - 在成功和错误代码路径中。否则,客户会坐在那里等待响应。它最终会超时并放弃,但是当它坐在那里等待可能永远不会出现的响应时,可能会产生后果(如您所见)。【参考方案2】:我是个白痴。出于某种原因,我将 try 和 catch 块留在了路由器的 post 方法之外。这就是为什么它没有从路由器给出任何响应!
我不知道为什么数据库在没有 try/catch 块的情况下成功更新了 6 次。但是添加 try catch 和 response 可以让它无休止地更新。
(请参阅下面使用 try 和 catch 更新的路由器发布方法)
router.post('/pageupdate/:_id',auth, async(req,res)=>
console.log("received request to update: ",req.body," id ",req.params);
const filter = "_id": req.params ;
const update = [ $set: req.body ];
try
let updatedDoc = await Pages.findOneAndUpdate(filter, update, returnNewDocument: true);
res.status(201).send(updatedDoc)
catch(e)
console.log(e);
res.status(400).send(e)
);
【讨论】:
以上是关于为啥 axios post 方法在连续 6 次 post 调用后停止工作?的主要内容,如果未能解决你的问题,请参考以下文章