Javascript 需要帮助。。!显示[object object]和应用程序的承载令牌因未处理PromisejectionWarning而崩溃:未处理承诺拒绝-Node.JS
根据此官方MS示例,尝试使用NodeJS集成PowerBI 我不太喜欢NodeJS。但我想了解这个api是如何工作的 试图通过Ajax onload调用以下端点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)
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()
我无法测试您的代码,因为我没有能够针对外部服务进行身份验证的配置文件,但我已经检查了您的代码,您在良好编程实践方面存在不少错误,以及影响代码操作的其他错误。我已经冒昧地重写了你的代码,以便你能更清楚地发现错误。以下是一些让您未来的代码变得更好的技巧:
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'});
});
});