MobileFirst - 调用适配器 - ERR_CONNECTION_RESET
MobileFirst - call adapter - ERR_CONNECTION_RESET
我在从我的应用程序调用 MobileFirst 适配器时遇到问题。
如果我使用 swagger 文档或邮递员来测试适配器方法,它就可以工作。
不幸的是,我从应用程序预览中收到消息:
http://localhost:6015/mfp/api/adapters/ServiceAdapter/login?params=%5Btest%2C%20test123%5D net::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);
}
2017 年 4 月 6 日编辑:
此外,我注意到,在调用适配器时,我在 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)
Mobilefirst App Preview 通过在端口 6015 上运行的代理连接到 MFP 服务器,您遇到的行为是正常的,与端口无关。
ERR_CONNECTION_RESET
错误是由浏览器引起的,而不是由 Mobilefirst 服务器引起的。
尝试用不同的浏览器发出请求,也尝试清除浏览器data/cache。
我已经解决了一个问题。我的 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 适配器时遇到问题。 如果我使用 swagger 文档或邮递员来测试适配器方法,它就可以工作。 不幸的是,我从应用程序预览中收到消息:
http://localhost:6015/mfp/api/adapters/ServiceAdapter/login?params=%5Btest%2C%20test123%5D net::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);
}
2017 年 4 月 6 日编辑:
此外,我注意到,在调用适配器时,我在 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)
Mobilefirst App Preview 通过在端口 6015 上运行的代理连接到 MFP 服务器,您遇到的行为是正常的,与端口无关。
ERR_CONNECTION_RESET
错误是由浏览器引起的,而不是由 Mobilefirst 服务器引起的。
尝试用不同的浏览器发出请求,也尝试清除浏览器data/cache。
我已经解决了一个问题。我的 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
升级也应该可以解决问题。