【问题标题】:Issues in Offline synchronization of JSONStore with Cloudant DBJSONStore 与 Cloudant DB 离线同步的问题
【发布时间】:2018-05-10 21:50:16
【问题描述】:

每当在 JSONStore 中输入任何 json 时,它都会像下面这样包装输入:{"json":{JSON_INPUT},"_id":1}。现在,如果我将 id 更改为 string 并尝试将其推送到 cloudant,它会成功推送它。但这不是正确的方法,因为它将包含包装器,并且当您下次尝试将其与 JSONStore 同步时,它将添加另一个类似的包装器,这将破坏您的 HTML 页面。现在我尝试的是向下一层(var str=dirtyDocuments[i].json)并仅发送输入(str),它每次都会给出以下错误:

[错误] FWLST0105E: 由于 java.io.IOException,可以上传用户日志文件:第 1 行第 2784 列出现意外字符“\u0000”。

以下是将数据同步回 cloudant DB 的代码:

pushToAdapter(){
let collectionName = 'activities';
let options = {};
WL.JSONStore.get(collectionName).getAllDirty(options)
.then(function (dirtyDocuments) {
for(var i=0; i < dirtyDocuments.length ; i++){
      var id = dirtyDocuments[i]._id;
      dirtyDocuments[i]._id=id.toString();}
      var resource = new WLResourceRequest("/adapters/ServiceAdapter/pushActivities", WLResourceRequest.GET)
      resource.setQueryParameter('params', dirtyDocuments)
      resource.send().then((success) => {
                console.log('-->JSONStore : Push document success', success)
              }, (failure) => {
                console.log('-->JSONStore: Push document failed', failure)
          })

  })
}

适配器方法:

function pushActivities(dirtyDocs) {
var path = 'employees';
    var input = {
    method : 'post',
    returnedContentType : 'json',
    path : path,
    body: {
    content: JSON.stringify(dirtyDocs),
    contentType: 'application/json'
}
};
return MFP.Server.invokeHttp(input);
} 

如果我能提供任何其他意见,请告诉我。

注意:我已通过提供如下示例输入来确认这一点: {“名称”:“abc”}。但它是一样的,所以我可以确保我的 json 输入中没有这样的字符。

编辑:

pushToAdapter(){
let collectionName = 'activities';
let options = {};
WL.JSONStore.get(collectionName).getAllDirty(options).then(function (dirtyDocs) {
for(var i=0;i<dirtyDocs.length;i++){
    var id=dirtyDocs[i]._id;
    id=id.toString();
    dirtyDocs[i]._id=id;
  }

WL.Client.invokeProcedure({
adapter : 'ServiceAdapter',
procedure : 'pushActivities',
parameters : dirtyDocs  // If i use say dirtyDocs[0].json it fails.
}).then(
(success)=>{console.log('success',success)},
(failure)=>{console.log('failure',failure)})}).then(function (responseFromAdapter) {
})
}

【问题讨论】:

  • 您能在这里分享代码 sn-ps 或完整项目吗?代码胜于雄辩
  • 我在这个问题中添加的几个 sn-ps。 stackoverflow.com/questions/47489647/…。现在我找到了一种解决方法,我已将数据作为其推送到 jsonstore 中,但是在重新加载或刷新数据时,我只使用“json”标签内的有效负载。我意识到这不应该是解决方案,可能是一个非常愚蠢的解决方法。
  • 您将所有 JSON 作为查询参数传递,这是一个坏主意 - 某些客户端对查询参数的大小有限制。而是将 JSON 作为正文的一部分发送。在将 JSON 作为查询参数发送时,请确保数据经过正确的 URL 编码。
  • 我们应该如何处理覆盖真实数据的包装器({"json":{"data":""},"_id":""})。当我调用 getdirtydocs 时,它附带了这个包装器,现在如果我通过这个 enitre 事情就很好了,但是它有一个不同的 _id 它将创建另一个记录,甚至结构也与真实数据不同。如果我进入返回的对象并仅发送数据部分,它会再次给出相同的错误(如上所述)。而且我已经稍微更新了代码,我不再在查询参数中发送它,我已经更新了我的问题。抱歉,如果这很烦人,我对此很陌生。

标签: ibm-mobilefirst cloudant mobilefirst-adapters jsonstore


【解决方案1】:

下面是对我有用的更新的 pushToAdapter() 方法。

pushToAdapter(){
    console.log("Inside push to adapter");
    let collectionName = 'activities';
    let options = {};
    WL.JSONStore.get(collectionName).getAllDirty(options).then(function (dirtyDocs) {
    var temp=[dirtyDocs[0].json];   //Here its only for one element.
    WL.Client.invokeProcedure({
        adapter : 'FieldsServiceAdapter',
        procedure : 'pushActivities',
        parameters : temp
    }).then(
        (success)=>{console.log('success',success)},
        (failure)=>{console.log('failure',failure)})}).then(function (responseFromAdapter) {
        console.log('Response from adapter',responseFromAdapter)
    })
}

所以变化基本上是它需要一个数组,而我只是发送一个 JSON 字符串。可能是一个非常愚蠢的错误。

注意:上面提到的错误与此无关,这是我后来发现的解析错误。上述错误可能是因为某些日志文件无法上传到服务器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 2018-05-30
    • 1970-01-01
    相关资源
    最近更新 更多