【问题标题】: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 函数的逻辑。由于所有这些代码都在工作,我的猜测是问题出在逻辑上。我看不出这个函数是如何被调用的。

标签: node.js reactjs mongodb express axios


【解决方案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)
}

});

【讨论】:

    猜你喜欢
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 2022-01-15
    • 2018-10-07
    • 2019-08-01
    • 2017-06-01
    • 2013-01-10
    相关资源
    最近更新 更多