JSONStore 与 Cloudant DB 的离线同步问题
Issues in Offline synchronization of JSONStore with Cloudant DB
每当在 JSONStore 中输入任何 json 时,它都会像下面这样包装输入:{"json":{JSON_INPUT},"_id":1}。现在,如果我将 id 更改为字符串并尝试将其推送到 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);
}
如果我可以提供任何其他帮助,请告诉我。
注意:我已经通过提供这样的示例输入来确认这一点:
{"name":"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) {
})
}
下面是对我有用的更新后的 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 字符串。可能是一个非常愚蠢的错误。
注意:上面提到的错误与此无关,这是我后来发现的解析错误。以上错误可能是因为某些日志文件无法上传到服务器。
每当在 JSONStore 中输入任何 json 时,它都会像下面这样包装输入:{"json":{JSON_INPUT},"_id":1}。现在,如果我将 id 更改为字符串并尝试将其推送到 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);
}
如果我可以提供任何其他帮助,请告诉我。
注意:我已经通过提供这样的示例输入来确认这一点: {"name":"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) {
})
}
下面是对我有用的更新后的 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 字符串。可能是一个非常愚蠢的错误。
注意:上面提到的错误与此无关,这是我后来发现的解析错误。以上错误可能是因为某些日志文件无法上传到服务器。