Intégration de l'application Node Js avec L'Api power BI rest

Est-il possible à l'aide de power bi API rest en node js, j'ai regardé la vidéo ,a Couru Breuer et Arina Hantsis ont été montrant la démo iciconfiguration et démarrage avec Power BI Embedded je veux réaliser la même chose mais en utilisant node JS, dans notre environnement de développement nous n'utilisons pas c#. J'ai trouvé le noeud SDK mais il dit que nous ne supportons plus le noeud SDK, noeud SDK

est-ce que je dois changer la structure de développement du noeud js au C# afin d'utiliser la puissance BI Rest API!!

11
demandé sur Jo Joy 2017-11-09 08:19:58

4 réponses

si vous voulez réaliser la même chose, ce que Ran Breuer et Arina Hantsis démontrent dans cette vidéo!

vous pouvez utiliser ces codes...

après avoir lu la documentation, j'ai trouvé cette solution il m'a fallu 5 jours pour la trouver, de toute façon je la poste ici pour que tout le monde puisse avoir facilement accès aux codes.

**AppOwnData Power bi intégré de rapports **

Contrôleur.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);
    });
   }
   };

Votre routeur 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 ou ce que jamais vous voulez

<!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>

Enfin Enjoy

localhost:4000/rapport/mettre votre id de groupe ici / vous mettre id de rapport ici

6
répondu Joyo Waseem 2017-11-19 12:30:43

j'ai utilisé les codes @Joyo Waseem et j'ai réussi à intégrer le rapport, puis j'ai essayé d'intégrer le tableau de bord et ça marche aussi, j'ai décidé de poster mes codes ici pour que quiconque essaie d'intégrer le tableau de bord puisse utiliser ces codes.

tableau de bord intégré utilisant L'API power Birs

Controler.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 getEmbedToken = function (accessToken, groupId, dashboardId) {

return new Promise(function (resolve, reject) {

    const url = 'https://api.powerbi.com/v1.0/myorg/groups/' + groupId + '/dashboards/' + dashboardId + '/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 = {
prepareView: function(req, res) {
    getAccessToken().then(function(accessToken) {
        console.log(req.params.groupId);
        getEmbedToken(accessToken, req.params.groupId, req.params.dashboardId).then(function(embedToken) {
            res.render('index', {
                dashboardId: req.params.dashboardId,
                embedToken,
                embedUrl: 'https://app.powerbi.com/dashboardEmbed?dashboardId=' + req.params.dashboardId + '&groupId=' + req.params.groupId
            });
        });
    });
}
};

index.js

  const express = require('express'),
  router = express.Router(),
  mainCtrl = require('../controllers/MainController');
  router.get('/dashboard/:groupId/:dashboardId', mainCtrl.prepareView);
  module.exports = router;

index.ejs etc.

 <!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;
}

  #dashboardContainer {
   height: 100%;
   min-height: 100%;
   display: block;
   }
 </style>
 </head>
<body>
  <div class="container-fluid fill">
 <div id="dashboardContainer"></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: 'dashboard',
  tokenType: models.TokenType.Embed,
  accessToken: '<%- embedToken %>',
  embedUrl: '<%- embedUrl %>',
  id: '<%- dashboardId %>'
  };
// Get a reference to the embedded dashboard HTML element 
   const dashboardContainer = $('#dashboardContainer')[0];
// Embed the dashboard and display it within the div container. 
   powerbi.embed(dashboardContainer, config);
   </script>
   </body>
   </html>
3
répondu Jo Joy 2017-11-19 12:53:34

@Jo la Joie qu'est-ce que la vu que vous devriez connaître .

https://github.com/Microsoft/PowerBI-Node/issues/40

il s'agit de priorités que ces entreprises décident dans quel projet elles vont .

ils peuvent très bien répondre à ce sujet. Mais en ce qui concerne la discussion, il n'y a pas de plan pour le faire . Vous pouvez accéder à l'api avant fév 2017 .

Si de nouvelles api, vous devez l'essayer pour votre . Peut-être vous folk . Nous, en tant que commundity contribuera .

0
répondu Himanshu sharma 2017-11-14 13:31:44

ils ne supportent plus le noeud SDK, mais l'avez-vous essayé? Il pourrait être encore en activité. Vous allez vouloir une sorte de SDK-il semble que c'est ce n'est pas la méthode la plus simple API pour travailler avec.

-1
répondu Sam H. 2017-11-14 12:16:37