0 votes
1 view
in BI by (15.1k points)

Is there a way using power bi rest API in node js, I watched video, Ran Breuer and Arina Hantsis were showing the demo here,Setting up and Getting Started with Power BI Embedded I want to achieve same but using node js, in our development environment we do not use c#. I found the Node SDK but it saying we no longer support node SDK,Node SDK

Do I have to change development structure from Node js to c# in order to use power bi Rest API!!

1 Answer

0 votes
by (41.2k points)

User these script files:

Controller.js

const request = require('request');

 const getAccessToken = function () {

return new Promise(function (resolve, reject) {

    const url = 'https://login.microsoftonline.com/common/oauth2/token';

    const username = ''; // Username of PowerBI "pro" account - stored in config

    const password = ''; // Password of PowerBI "pro" account - stored in config

    const clientId = ''; // Applicaton ID of app registered via Azure Active Directory - stored in config

    const headers = {

        'Content-Type': 'application/x-www-form-urlencoded'

    };

    const formData = {

        grant_type: 'password',

        client_id: clientId,

        resource: 'https://analysis.windows.net/powerbi/api',

        scope: 'openid',

        username: username,

        password: password

    };

    request.post({

        url: url,

        form: formData,

        headers: headers

    }, function (err, result, body) {

        if (err) return reject(err);

        const bodyObj = JSON.parse(body);

        resolve(bodyObj.access_token);

    });

   });

  };

  const getReportEmbedToken = function (accessToken, groupId, reportId) {

return new Promise(function (resolve, reject) {

    const url = 'https://api.powerbi.com/v1.0/myorg/groups/' + groupId + '/reports/' + reportId + '/GenerateToken';

    const headers = {

        'Content-Type': 'application/x-www-form-urlencoded',

        'Authorization': 'Bearer ' + accessToken

    };

    const formData = {

        'accessLevel': 'view'

    };

    request.post({

        url: url,

        form: formData,

        headers: headers

    }, function (err, result, body) {

        if (err) return reject(err);

        const bodyObj = JSON.parse(body);

        resolve(bodyObj.token);

    });

});

};

   module.exports = {

embedReport: function (req, res) {

    getAccessToken().then(function (accessToken) {

        getReportEmbedToken(accessToken, req.params.groupId, req.params.reportId).then(function (embedToken) {

            res.render('index', {

                reportId: req.params.dashboardId,

                embedToken,

                embedUrl: 'https://app.powerbi.com/reportEmbed?reportId=' + req.params.reportId + '&groupId=' + req.params.groupId

            });

        }).catch(function (err) {

            res.send(500, err);

        });

    }).catch(function (err) {

        res.send(500, err);

    });

   }

   };

Your router index.js

   const express = require('express'),

   router = express.Router(),

   mainCtrl = require('../controllers/MainController');

  router.get('/report/:groupId/:reportId', mainCtrl.embedReport);

  module.exports = router;

index.ejs

<!DOCTYPE html>

   <html>

    <head>

  <title>Node.js PowerBI Embed</title>

  <link rel="stylesheet" href="/bootstrap/dist/css/bootstrap.min.css" />

  <style>

    html,

    body {

  height: 100%;

   }

.fill {

  min-height: 100%;

  height: 100%;

  box-sizing: border-box;

}

#reportContainer {

  height: 100%;

  min-height: 100%;

  display: block;

}

</style>

</head>

 <body>

<div class="container-fluid fill">

<div id="reportContainer"></div>

</div>

<script src="/jquery/dist/jquery.min.js"></script>

<script src="/bootstrap/dist/js/bootstrap.min.js"></script>

<script src="/powerbi-client/dist/powerbi.js"></script>

<script>

const models = window['powerbi-client'].models;

const config = {

  type: 'report',

  tokenType: models.TokenType.Embed,

  accessToken: '<%- embedToken %>',

  embedUrl: '<%- embedUrl %>',

  id: '<%- reportId %>'

    };

   // Get a reference to the embedded dashboard HTML element 

   const reportContainer = $('#reportContainer')[0];

  // Embed the dashboard and display it within the div container. 

   powerbi.embed(reportContainer, config);

 </script>

 </body>

</html>

Welcome to Intellipaat Community. Get your technical queries answered by top developers !


Categories

...