Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 需要帮助。。!显示[object object]和应用程序的承载令牌因未处理PromisejectionWarning而崩溃:未处理承诺拒绝-Node.JS_Javascript_Node.js_Powerbi - Fatal编程技术网

Javascript 需要帮助。。!显示[object object]和应用程序的承载令牌因未处理PromisejectionWarning而崩溃:未处理承诺拒绝-Node.JS

Javascript 需要帮助。。!显示[object object]和应用程序的承载令牌因未处理PromisejectionWarning而崩溃:未处理承诺拒绝-Node.JS,javascript,node.js,powerbi,Javascript,Node.js,Powerbi,根据此官方MS示例,尝试使用NodeJS集成PowerBI 我不太喜欢NodeJS。但我想了解这个api是如何工作的 试图通过Ajax onload调用以下端点 app.get('/getSingRpt', function (req, res) { try { let pbiRec = embedToken.getEmbedParamsForSingleReport() console.log('getSingRpt====>', pbiRec)

根据此官方MS示例,尝试使用NodeJS集成PowerBI 我不太喜欢NodeJS。但我想了解这个api是如何工作的

试图通过Ajax onload调用以下端点

app.get('/getSingRpt', function (req, res) {
    try {
        let pbiRec = embedToken.getEmbedParamsForSingleReport()
        console.log('getSingRpt====>', pbiRec)
        res.status(200).json();
    } catch (error) {
        res.status(400).json({
            status: 'failed',
            message: 'Unable to fetch the report'
        });
    }
});
api然后点击服务,如下所示

async function getEmbedParamsForSingleReport(workspaceId, reportId, additionalDatasetId) {
    const reportInGroupApi = `https://api.powerbi.com/v1.0/myorg/groups/${workspaceId}/reports/${reportId}`;
    const headers = await getRequestHeader();
    const result = await fetch(reportInGroupApi, {
        method: 'GET',
        headers: headers,
    })
    console.log('From service===>>>>> headers', headers);
    console.log('result ===>>>>> headers', result);
   
    if (!result.ok) {
        throw result;
    }
    const resultJson = await result.json();
    const reportDetails = new PowerBiReportDetails(resultJson.id, resultJson.name, resultJson.embedUrl);
    const reportEmbedConfig = new EmbedConfig();

    reportEmbedConfig.reportsDetail = [reportDetails];

    let datasetIds = [resultJson.datasetId];
    if (additionalDatasetId) {
        datasetIds.push(additionalDatasetId);
    }

    reportEmbedConfig.embedToken = await getEmbedTokenForSingleReportSingleWorkspace(reportId, datasetIds, workspaceId);
    return reportEmbedConfig;
}
然后调用authentication.js

 const getAccessToken = async function () {
        let adal = require("adal-node");
        let AuthenticationContext = adal.AuthenticationContext;
        let config = require(__dirname + "/../config/config.json");
    
        let authorityUrl = config.authorityUri;
        if (config.authenticationMode.toLowerCase() === "masteruser") {
            let context = new AuthenticationContext(authorityUrl);
    
            return new Promise(
                (resolve, reject) => {
                    context.acquireTokenWithUsernamePassword(config.scope, config.pbiUsername, config.pbiPassword, config.clientId, function (err, tokenResponse) {
    
                        if (err) {
                            reject(tokenResponse == null ? err : tokenResponse);
                        }
                        resolve(tokenResponse);
                    })
                }
            );
    
        } else if (config.authenticationMode.toLowerCase() === "serviceprincipal") {
            authorityUrl = authorityUrl.replace("common", config.tenantId);
            let context = new AuthenticationContext(authorityUrl);
            try {
                
            } catch (error) {
                
            }
            return new Promise(
                (resolve, reject) => {
                    context.acquireTokenWithClientCredentials(config.scope, config.clientId, config.clientSecret, function (err, tokenResponse) {
                        if (err) {
                            reject(tokenResponse == null ? err : tokenResponse);
                        }
                        resolve(tokenResponse);
                    })
                }
            );
        }
    }
最初尝试从调用getEmbedParamsForSingleReport()时,我遇到了一些身份验证问题

不知何故,我修复了身份验证问题,现在可以获得访问令牌。成功获取令牌后,我出现以下错误

就我而言,
else
part应该可以工作,但一旦成功获得访问令牌应用程序就崩溃了

有人能告诉我怎么解决吗

未处理的PromisejectionWarning:未处理的承诺拒绝。这 错误源于异步函数的内部抛出 没有拦截,或拒绝未处理的承诺 with.catch()


我无法测试您的代码,因为我没有能够针对外部服务进行身份验证的配置文件,但我已经检查了您的代码,您在良好编程实践方面存在不少错误,以及影响代码操作的其他错误。我已经冒昧地重写了你的代码,以便你能更清楚地发现错误。以下是一些让您未来的代码变得更好的技巧:

  • “require”语句始终超出您的定义范围 功能

  • 对于不会更改的变量,请使用“const”而不是“let” 他们的价值

  • 使用“承诺”或“异步/等待”,但决不能同时使用这两者, 因为这样你就得到了“承诺未解决”的错误

  • 确保你总是下定决心或拒绝承诺,并且承诺 永远不会有未完成的事情

  • 不要不必要地重复代码,使用选项卡可以 以更清晰的方式想象它

  • 函数中不需要多个承诺,只要有一个 在每种情况下解决或拒绝的

  • 小心使用“if/else if”,并确保始终使用“else” 最后,确保所有的可能性

  • 尝试更改配置文件的路径,使其成为 相对路径,不要使用绝对路径(我没有改变这一点 部分代码,因为我不知道 项目

  • 最后,您可以这样调用函数:

    getAccessToken()
    .then((token) => console.log(token))
    .catch((err) => console.error(err));
    
    我希望我帮了忙。祝你好运

    编辑 好的,今天下午我会试着看一看并解决你的问题。我现在用肉眼看到了一些。 您必须更改/getSignRpt的实现以等待返回结果,因为“getEmbedParamsForSingleReport”是异步的:

    app.get('/getSingRpt', (req, res) => {
      embedToken
        .getEmbedParamsForSingleReport()
        .then((result) => {
          console.log(result);
          res.status(200).send({success: true, data: result});
        })
        .catch((e) => {
          console.error(e);
          res
            .status(400)
            .send({success: false, message: 'Unable to fetch the report'});
        });
    });
    

    您还必须将这3个参数传递给“getEmbedParamsForSingleReport”函数,您当前在调用它时没有向它传递任何内容。

    Mauel Martinez..非常感谢您的快速响应。我只是复制并粘贴了修改后的代码,仍然看到相同的未处理错误以及`error:`TypeError:auth.getAccessToken不是函数`当我在
    getEmbedPar中调用getAccessToken方法时amsForSingleReport()
    在第#2行,我需要一些更多的信息来帮助您。告诉我您正在使用的所有库,以及我如何构建一个示例来为您提供正确工作的代码。我不知道您告诉我的函数是在哪里实现的。Manuel Martinez实际上所有的实现都在这个官方MS中,您可以n如果您有,请提供Azure AD凭据..我刚刚编辑了我的答案。令牌在accessToken字段中返回,您将返回整个负载。另外,使用msal库可以帮助您完成ADauth@quirimmo你能和我分享一些实现的例子吗..我实际上是NodeJs的节点,所以很难完成这个节点部分
    app.get('/getSingRpt', (req, res) => {
      embedToken
        .getEmbedParamsForSingleReport()
        .then((result) => {
          console.log(result);
          res.status(200).send({success: true, data: result});
        })
        .catch((e) => {
          console.error(e);
          res
            .status(400)
            .send({success: false, message: 'Unable to fetch the report'});
        });
    });