使用 Android 5.0+ 会发送两次 Node.js 请求

Posted

技术标签:

【中文标题】使用 Android 5.0+ 会发送两次 Node.js 请求【英文标题】:Node.js requests are being sent twice with Android 5.0+ 【发布时间】:2015-12-02 21:59:45 【问题描述】:

我有一个 node/express/socket.io 应用程序。当我在 android 4 及更早版本上运行该应用程序时,它工作得很好。但是,对于 android 5.0+ 及更高版本,每次我的应用程序加载并执行其初始路由 (/) 时,它都会发送两次路由函数。第二次执行时,请求正文中没有任何内容,导致应用出错。

app.post('/', someFunction);

我已经记录了这个函数 req.url 并注意到它在 android 5.0+ 中点击了 someFunction 两次,但之前的任何东西都只点击了一次并正常执行。

有没有人想过为什么这会在新版本的android上引起?而不是其他人?还要提一下,这适用于 ios

【问题讨论】:

胡思乱想:你用的是websockets.io还是socket.io?还有你用的是什么客户端?如果客户端回退到 AJAX,它可能与“优雅的回退”有关。使用 socket.io 时,它也可能是一个快速的“传输升级”——socket.io 以 XHR 开头,并在测试 websocket 连接后升级,可能在 Android 5.0+ 上它升级太快了。 @Myst 我正在使用 socket.io,抱歉不是 websockets.io。就客户端而言,它是一个 android 应用程序中的 Web 视图。在模拟器和实时设备硬件上都有问题。这是您所说的 CLIENT 还是其他什么? 感谢您解决这个问题。 Socket.io 既是客户端又是服务器框架,所以我假设您在 Android 上使用 socket.io API 来编写客户端代码……您可以记录两个请求的传输层(XHR 与 Websockets)吗?这可能与socket.io的升级过程有关,但我在黑暗中投掷飞镖。 @Myst 大声笑,我希望我能告诉你我知道如何记录传输层。 希望我能帮你解决这个问题...我从来没有用 socket.io 做过 Android(我不是这个框架的完整粉丝,我更喜欢直接使用 Websockets)。 【参考方案1】:

问题与 sockets.io 无关。它与较新的 android OS 网络视图如何处理一些 JS 有关。在与该路由关联的 EJS 模板中,我有一个

    window.location.reload();

这适用于 iOS 和较旧的 android 操作系统,但新版本不喜欢它。我能够切换到:

window.location.href = window.location.href;

这似乎很有效。

【讨论】:

我很高兴您找到了解决方案,尽管我必须承认这是一个惊喜。我能想到的唯一区别与缓存(see here)有关...也许某些 javascript 依赖于未完成加载的内容(是否在onload 事件之前运行?)...可能是故障(类似于this)...时髦:) @Myst 让我再问你一个问题,你可能也知道答案。使用相同的应用程序,对于旧版本的 Android,我会得到一个恒定的页面加载轮,而且它永远不会停止。但是对于较新的版本,它工作得很好。有什么对你不满意的吗? 我不知道...我想我需要阅读更多代码才能找到问题所在。不管怎样,祝你好运!

以上是关于使用 Android 5.0+ 会发送两次 Node.js 请求的主要内容,如果未能解决你的问题,请参考以下文章

应用发送两次 POST 请求

有史来最大改变 Android 5.0十大新特性

在 Android 5.0+ 中使用短时间重复警报的正确方法是啥?

android Camera2 API使用详解

Laravel 邮件在添加密件抄送时会发送两次电子邮件

websocket接收消息再发送会发送两次