MobileFirst - 呼叫适配器 - ERR_CONNECTION_RESET

Posted

技术标签:

【中文标题】MobileFirst - 呼叫适配器 - ERR_CONNECTION_RESET【英文标题】:MobileFirst - call adapter - ERR_CONNECTION_RESET 【发布时间】:2017-04-03 09:28:29 【问题描述】:

我在从我的应用程序调用 MobileFirst 适配器时遇到问题。 如果我使用 swagger docs 或 postman 来测试适配器方法,它可以工作。 不幸的是,从应用预览中,我收到了消息:

http://localhost:6015/mfp/api/adapters/ServiceAdapter/login?params=%5Btest%2C%20test123%5Dnet::ERR_CONNECTION_RESET

我不明白为什么我的应用程序对适配器的请求被转发到端口 6015。在测试期间(swagger 和邮递员)我使用了 9080,可能是问题所在,但我不知道如何更改应用目标端口从 6015 到 9080。

适配器 xml:

<mfp:adapter name="ServiceAdapter"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:mfp="http://www.ibm.com/mfp/integration"
         xmlns:http="http://www.ibm.com/mfp/integration/http">

<displayName>ServiceAdapter</displayName>
<description>ServiceAdapter</description>
<connectivity>
    <connectionPolicy xsi:type="http:HTTPConnectionPolicyType">
        <protocol>http</protocol>
        <domain>localhost</domain>
        <port>53873</port>
        <connectionTimeoutInMilliseconds>30000</connectionTimeoutInMilliseconds>
        <socketTimeoutInMilliseconds>30000</socketTimeoutInMilliseconds>
        <maxConcurrentConnectionsPerNode>50</maxConcurrentConnectionsPerNode>
    </connectionPolicy>
</connectivity>

<procedure name="login" secured="false" />

实现:

function login(login, pass) 
    path = 'token';
    var input = 
        method : 'post',
        returnedContentType : 'json',
        path : path,
        headers : 
            'Content-Type' : 'application/x-www-form-urlencoded'
        ,
        body : 
            contentType : 'application/x-www-form-urlencoded',
            content : 'username=' + login + '&password=' + pass + '&grant_type=password'
        
    ;
    return MFP.Server.invokeHttp(input);

和适配器调用:

function Login() 
    var resourceRequest = new WLResourceRequest(
            "/adapters/ServiceAdapter/login",
            WLResourceRequest.GET
    );

    resourceRequest.setQueryParameter("params", "[" + $("#log").val() + ", " + $("#pass").val() + "]");
    resourceRequest.send().then(LoginSuccess, LoginFailure);

于 6.04.2017 编辑: 另外,我注意到,在适配器调用的那一刻,我在控制台中从 previewCordova.js 文件中收到此错误。看起来变量 req.url 未定义:

C:\...\npm\node_modules\mfpdev-cli\node_modules\mdo-app-preview\lib\previewCordova.js:579
    if(!req.url.startsWith('/')) 
                ^
TypeError: undefined is not a function
    at Server.<anonymous> (C:\..\npm\node_modules\mfpdev-cli\node_modules\mdo-app-preview\lib\previewCordova.js:579:17)
    at Server.emit (events.js:110:17)
    at HTTPParser.parserOnIncoming [as onIncoming] (_http_server.js:491:12)
    at HTTPParser.parserOnHeadersComplete (_http_common.js:111:23)
    at Socket.socketOnData (_http_server.js:343:22)
    at Socket.emit (events.js:107:17)
    at readableAddChunk (_stream_readable.js:163:16)
    at Socket.Readable.push (_stream_readable.js:126:10)
    at TCP.onread (net.js:538:20)

【问题讨论】:

【参考方案1】:

Mobilefirst App Preview 通过代理连接到 MFP 服务器,代理在 6015 端口上运行,您遇到的行为是正常的,与端口无关。

ERR_CONNECTION_RESET 错误是由浏览器引起的,而不是来自 Mobilefirst 服务器。

尝试使用不同的浏览器发出请求,并尝试清除浏览数据/缓存。

【讨论】:

好的,我在 mozilla 中尝试过并且错误消失了,但适配器调用仍然无法正常工作。是否有可能,提到的代理没有使用 Mobilefirst App Preview 正确启动?我用标准命令启动它:mfpdev app preview android,ios,windows --type mbs --noprompt --pid @robr 通过this tutorial 了解如何在预览模式下运行应用程序。还要确保您的应用程序的适配器调用在cordova中工作正常,如果它不能解决您的问题,请分享您在预览模式下调用服务器时收到的错误响应。 我可能在这里抓住了救命稻草,但这种错误也可能是由于本地计算机上设置的防火墙规则造成的 - 您可以制定规则来防止任何东西连接到本地主机上的端口 6015。这只是一个猜测,但可能值得研究。 我浏览了教程并检查了端口规则,但没有结果。我编辑了问题并更准确地描述了收到的错误。【参考方案2】:

我已经解决了一个问题。我的NodeJS 版本不支持javascript String.prototype.startsWith 方法。所以我已经将此方法添加到previewCordova.js 文件中:

if (!String.prototype.startsWith) 
  String.prototype.startsWith = function(searchString, position) 
    position = position || 0;
    return this.indexOf(searchString, position) === position;
  ;

较新版本的NodeJS 已经实现了startsWith 方法,所以NodeJS 升级也应该可以解决问题。

【讨论】:

以上是关于MobileFirst - 呼叫适配器 - ERR_CONNECTION_RESET的主要内容,如果未能解决你的问题,请参考以下文章

MobileFirst 适配器 - 为啥我在 MobileFirst 操作控制台的 Swagger 文档页面上发出请求时收到“401 Unauthorized”错误

调用 mobilefirst 适配器时出错:调用过程失败

Mobilefirst 8.0 Java 适配器 SSL

MobileFirst 8.0:一个应用程序的多个适配器

mobilefirst 中的 SQL 适配器身份验证

IBM Mobilefirst Java 适配器会话超时