在调试模式和正常模式之间react本机不同的行为

IT技术 javascript android reactjs react-native request
2021-05-25 20:17:09

嗨,我有一个非常复杂的问题。所以我在 github 上为这个问题创建了一个新的 repo。所以你可以克隆它,看看是什么问题。

https://github.com/guitar9/hafas-client-example

在这个项目中使用https://github.com/public-transport/hafas-client来获取火车和火车站信息。

client.journeys(münchenHbf, münchenPassing)
.then((response)=>{
  console.log('===============response=====================');
  console.log(response);
  console.log('====================================');
})
.catch(console.error)

请求在

node_modules/hafas-client/lib/request

问题是在调试模式下一切正常(摇动手机并启动远程 JS 调试),但是当我停止 JS 调试时,我收到错误“PARSE”。

所以我在 request.js 中查找并在调试模式下而不是在调试模式下注销请求和响应。

请求调试模式

{
    "method": "post",
    "body": "{\"lang\":\"en\",\"svcReqL\":[{\"cfg\":{\"polyEnc\":\"GPA\"},\"meth\":\"TripSearch\",\"req\":{\"outDate\":\"20180614\",\"outTime\":\"174837\",\"ctxScr\":null,\"getPasslist\":false,\"maxChg\":5,\"minChgTime\":0,\"depLocL\":[{\"lid\":\"A=1@L=008000261@\"}],\"viaLocL\":null,\"arrLocL\":[{\"lid\":\"A=1@L=008004158@\"}],\"jnyFltrL\":[{\"type\":\"PROD\",\"mode\":\"INC\",\"value\":\"1023\"},{\"type\":\"META\",\"mode\":\"INC\",\"meta\":\"notBarrierfree\"}],\"getTariff\":false,\"outFrwd\":true,\"getPT\":true,\"getIV\":false,\"getPolyline\":false,\"numF\":5,\"trfReq\":{\"jnyCl\":2,\"tvlrProf\":[{\"type\":\"E\",\"redtnCard\":null}],\"cType\":\"PK\"}}}],\"client\":{\"id\":\"DB\",\"v\":\"16040000\",\"type\":\"IPH\",\"name\":\"DB Navigator\"},\"ext\":\"DB.R15.12.a\",\"ver\":\"1.16\",\"auth\":{\"type\":\"AID\",\"aid\":\"n91dB8Z77MLdoR0K\"}}",
    "headers": {
        "Content-Type": "application/json",
        "Accept": "application/json",
        "user-agent": "https://github.com/public-transport/hafas-client"
    },
    "query": {
        "checksum": "6af3b74db20e14c7f94012e3de55dce6"
    }
}

响应调试模式

所有信息。一切都好。

请求不在调试模式

{
    "method": "post",
    "body": "{\"lang\":\"en\",\"svcReqL\":[{\"cfg\":{\"polyEnc\":\"GPA\"},\"meth\":\"TripSearch\",\"req\":{\"outDate\":\"Invalid DateTime\",\"outTime\":\"Invalid DateTime\",\"ctxScr\":null,\"getPasslist\":false,\"maxChg\":5,\"minChgTime\":0,\"depLocL\":[{\"lid\":\"A=1@L=008000261@\"}],\"viaLocL\":null,\"arrLocL\":[{\"lid\":\"A=1@L=008004158@\"}],\"jnyFltrL\":[{\"type\":\"PROD\",\"mode\":\"INC\",\"value\":\"1023\"},{\"type\":\"META\",\"mode\":\"INC\",\"meta\":\"notBarrierfree\"}],\"getTariff\":false,\"outFrwd\":true,\"getPT\":true,\"getIV\":false,\"getPolyline\":false,\"numF\":5,\"trfReq\":{\"jnyCl\":2,\"tvlrProf\":[{\"type\":\"E\",\"redtnCard\":null}],\"cType\":\"PK\"}}}],\"client\":{\"id\":\"DB\",\"v\":\"16040000\",\"type\":\"IPH\",\"name\":\"DB Navigator\"},\"ext\":\"DB.R15.12.a\",\"ver\":\"1.16\",\"auth\":{\"type\":\"AID\",\"aid\":\"n91dB8Z77MLdoR0K\"}}",
    "headers": {
        "Content-Type": "application/json",
        "Accept": "application/json",
        "user-agent": "https://github.com/public-transport/hafas-client"
    },
    "query": {
        "checksum": "0d8186da7b06f9cc094075a2a6e21b00"
    }
}

响应不在调试模式

{
    "ver": "1.16",
    "ext": "DB.R15.12.a",
    "lang": "eng",
    "id": "",
    "err": "PARSE",
    "svcResL": []
}

我已经比较了请求。在这里您可以看到两个请求之间的区别。 https://www.diffnow.com/?report=pvuq7 问题是 outDate、outTime 和 checksum。有人可以帮助我吗?

2个回答

问题是在 hafas-client 库中使用了Luxon库。你会看到你在 repo 中提供的代码在 iOS 和 android 上运行良好,只有启用了远程调试。为什么?

启用远程调试后,代码不会在您的手机中运行,而是在 Chrome 浏览器的 V8 引擎中运行。当远程调试被禁用时,代码会在你的手机上运行,​​而在 android 的情况下,它会在 2014 年末的 JavaScriptCore (JSC) 引擎上运行,该引擎使用自定义设置编译为 react native - 这可能会提供不同的结果。

正如 luxon 文档指出的那样,对 android 上的 react native 的支持是有限的。

在 iOS 上,react native 使用操作系统提供的 JSC,其中还包括 intl 功能。android 上的 JSC 没有 int 支持的原因是 JSC 与 apk 捆绑在一起,使用 intl 支持编译它会增加几 MB 的 apk 大小。

通过一些自定义(分叉 hafas 客户端)并解决日期问题,我相信您应该能够解决这个问题。您也可以使用它,但请注意,您可能会遇到其他类型的问题,这些问题可能很难获得帮助(有一段时间,Expo 客户端曾经使用从这个 repo 编译的 JSC,但他们不得不停止使用自定义构建因为一些问题)。

或者,您可以尝试使用intl polyfill

我是怎么发现的?在这里你会看到错误对象包含一堆额外的信息。当您记录错误时,您只是获取该description字段,但是如果您记录该request字段,您将看到它包含"outDate": "Invalid DateTime". 就在那里!

作者在hafas-client这里。发布作为可见性的答案,因为我没有评论的声誉。

正如我已经证明https://github.com/public-transport/hafas-client/issues/56#issuecomment-399915315我设法利用hafas-client@3.0.0-alpha.9在react本土外的开箱,我已经加了之后node-libs-react-native垫片请试试这个。

有可能的当然是与另一个问题luxon(如在讨论https://stackoverflow.com/a/51005700),但没有起码的查询数据EPARSE错误或者未解码的响应有效载荷是相关的luxon,显然解决了。