为啥 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 调用后停止工作?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 axios.post 不能通过数组?

为啥有时在计时器滴答事件中它会连续两次调用该方法?

为啥axios数据存储在变量中时未定义?

vue axios请求频繁时取消上一次请求

为啥 axios get 方法请求发送两次?

为啥axios请求接口会发起两次请求