Skip to main content
Announcements
Qlik Connect 2025: 3 days of full immersion in data, analytics, and AI. May 13-15 | Orlando, FL: Learn More
cancel
Showing results for 
Search instead for 
Did you mean: 
Pirolli
Partner - Contributor
Partner - Contributor

Exporting apps with Node JS

Hello, 

I have been wrestling with the qrs api for the past few days to create a process for moving apps from one environment to another. Currently my only goal is to download an app & upload it back onto the hub with a different name - I seem to have trouble with the app format as it is not recognized. Any help? Below is my request (excuse the poor text formatting).

 

var https = require('https');
var fs = require('fs');

var targetApp = 'Sandbox'
var options = {
hostname: <server.name>,
port: 4242,
path: '/qrs/app?xrfkey=abcdefghijklmnop',
method: 'GET',
headers: {
'x-qlik-xrfkey' : 'abcdefghijklmnop',
'X-Qlik-User' : 'UserDirectory= INTERNAL; UserId= sa_repository'
},
key: fs.readFileSync("client_key.pem"),
cert: fs.readFileSync("client.pem"),
ca: fs.readFileSync("root.pem")
};

 

//get app list

https.get(options, function(res) {
console.log("Got response: " + res.statusCode);
var body = '';
res.on("data", function(chunk) {
body += chunk;
});
res.on("end", function() {
var appList = JSON.parse(body);

 

//find target app id
var targetAppId = '';
for(var i = 0;i < appList.length;i++){
if(targetApp == appList[i].name){
var targetAppId = appList[i].id;

 

//1st export step of target app
options.path = '/qrs/app/' + targetAppId + '/export/' + targetAppId + '?skipData=false&xrfkey=abcdefghijklmnop';
options.method = 'POST';
https.get(options, function(resp) {
console.log("Got response (Export1): " + resp.statusCode);
var exportjson = '';
resp.on("data", function(chunk) {
exportjson += chunk;
});
resp.on('end',function(){
var exportobj = JSON.parse(exportjson);

 

//2nd export step on target app
options.path = exportobj.downloadPath + '&xrfkey=abcdefghijklmnop';
options.method = 'GET';
https.get(options, function(re) {
console.log('Got response (Export2): ' + re.statusCode);
var rawApp = '';
re.on('data',function(chunk){
rawApp += chunk;
});
re.on('end',function(){

 

 

//upload app with new name Test. This is where it fails with a 500 error due to invalid format
options.headers['Content-Type'] = 'application/vnd.qlik.sense.app';
options.path = '/qrs/app/upload?name=Test&xrfkey=abcdefghijklmnop';
options.method = 'POST';

var uploadApp = https.request(options,function(response){
console.log('Got response (upload): ' + response.statusCode);
response.on('data',function(chunk){console.log('body: ' + chunk);});
});

uploadApp.write(rawApp );
uploadApp.end();
//fs.writeFile(targetApp + '.qvf',rawApp,function (err){
// console.log(err);
//});
});
}).on('error', function(e) {
console.log("Got error: " + e.message);
});

});
}).on('error', function(e) {
console.log("Got error: " + e.message);
});

}
}
});
}).on('error', function(e) {
console.log("Got error: " + e.message);

});

0 Replies