Мы пытаемся построить Rest API поверх кэша воспламенения, используя узел express.
При получении данных в курсоре мы сталкиваемся со следующими проблемами:
- Свойство cursor._values всегда имеет только 1024 строки, хотя таблица имеет размер 100 000 строк.
- Свойство cursor._fieldnames не отображает имена полей, в результате чего мы создали массив со списком полей и создали список json объектов с использованием этого массива и обход каждой строки курсора. Значения с использованием функции карты.
Также, пожалуйста, дайте мне знать, есть ли способ прямого преобразования полей sql вывод запроса на JSON с использованием узла express.
Ниже приведен код, используемый для построения API.
const express=require('express');
const url=require('url');
//const routes=require('./igniteroute');
const querystring=require('querystring');
const bodyParser = require('body-parser');
const request=require('request');
const IgniteClient = require('apache-ignite-client');
const SqlFieldsQuery = IgniteClient.SqlFieldsQuery;
const IgniteClientConfiguration = IgniteClient.IgniteClientConfiguration;
const ENDPOINT='127.0.0.1';
const CACHE_NAME='ProductDetailsCache';
var _ = require('underscore');
const app=express();
app.use(bodyParser.json());
app.get('/productdetails',async function(req,res){
const igniteClient =await new IgniteClient();
try {
await igniteClient.connect(new IgniteClientConfiguration(ENDPOINT));
const cache = igniteClient.getCache('ProductDetailsCache');
const queryparametre=await req.query;
const page=await parseInt(req.query.page);
const limit=10000;
const startindex=(page-1)*limit;
const endindex=page*limit;
const count_input_query_params=Object.keys(queryparametre).length;
if(count_input_query_params==1
&& queryparametre.hasOwnProperty("page")
){
const queryProductDetails=new SqlFieldsQuery(`select field1,field2 from ProductDetails
`
)
;
const queryNAV=new SqlFieldsQuery(`select field1,field2,field3,field4
from PIE.ProductNav
`
)
;
const cursorProductDetails = await cache.query(queryProductDetails);
const cursorNAV = await cache.query(queryNAV);
const rowProductDetails =await cursorProductDetails.getValue();
const rowNAV =await cursorNAV.getValue();
const dataProductDetails=cursorProductDetails._values;
//console.log(dataProductDetails);
const dataNAV=cursorNAV._values;
console.log(cursorProductDetails._values.length);
var res_data_prddetails=[];
var res_data_navdetails=[];
console.log(dataProductDetails.length);
console.log(dataNAV.length);
var prdfields=["field1","field2"];
var navfields=["field1","field2","field3","field4"]
await dataProductDetails.map(function(arr){
var prdobj={};
prdfields.forEach((k,v)=> prdobj[k]=arr[v]);
res_data_prddetails.push(prdobj);
}
);
await dataNAV.map(function(arr){
var navobj={};
navfields.forEach((k,v)=> navobj[k]=arr[v]);
res_data_navdetails.push(navobj);
//console.log("NAV:"+Object.values(navobj)+Object.keys(navobj));
}
);
console.log(res_data_prddetails.length);
nested_results=[];
await res_data_prddetails.map(function(arr){
var tempobj=[arr];
var navfiltereddata=_.where(res_data_navdetails,
{ field1:arr.field1,
field2:arr.field2
}
);
tempobj[0].NAV=navfiltereddata;
nested_results.push(tempobj[0]);
}
);
//console.log("Without sort"+nested_results);
const nested_results_Sorted=_.chain(nested_results).sortBy('field1').sortBy('field2').
value();
// console.log("With sort"+nested_results_Sorted);
const results_paginated=nested_results_Sorted.slice(startindex,endindex);
//console.log("results"+nested_results_Sorted);
const rec_cnt=nested_results_Sorted.length;
const prev_page=page-1;
const next_page=page+1;
//console.log(cursor);
const results={};
if(page!=1 && endindex<rec_cnt){
results.previous="/productdetails?page="+prev_page;
results.next="/productdetails?page="+next_page;
}
else if (endindex>=rec_cnt){
results.next="/productdetails?page="+next_page;
}
else {
results.previous="/productdetails?page="+prev_page;
}
results.totreccount=rec_cnt;
results.reccountperpage=limit;
results.Product=results_paginated;
if (results_paginated.length==0){
res.status(404).json({"Message":"No Data exists"});
}
else{
res.status(200).json(results);
} ;
}
else
{
res.status(400).json({
"Message":"Invalid no of query parametres.Needed page as query params "
});
}
}
catch (err) {
res.json({
"Message ": err.message});
}
finally {
igniteClient.disconnect();
}
});
//listen for requests
app.listen(process.env.port||4000,
function(){
console.log('now listensing to port '+4000);
});