You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Outlook网页版插件点击确认对话框YES按钮触发5001错误求助

提问:Outlook网页版插件点击确认对话框YES时触发5001内部错误(Windows客户端正常)

我正在开发Outlook Add-in,目前遇到一个问题:在Outlook网页版中点击确认对话框的“YES”选项时,会抛出错误 OSF.DDA.Error {name: 'Internal Error', message: 'An internal error has occurred.', code: 5001},但该功能在Windows客户端版本中运行完全正常。

补充信息:

  • 错误触发时机:点击YES后执行axios调用后端接口删除文件时
  • 已尝试操作:设置对话框的targetOrigin选项,无效果
  • Manifest配置:DefaultMinVersion设置为1.8
  • 开发背景:已遵循微软官方文档开发,是Office.js新手

对话框显示代码

async function confirmDelete() {
 
    var env = '#{env}#';
    var url = window.location.origin + "/" + env + "/confirmDialog.html";
    Office.context.ui.displayDialogAsync(url, { height: 10, width: 20, displayInIframe: true }, dialogCallback);
}

function dialogCallback(asyncResult) {
    if (asyncResult.status == "failed") {
        document.getElementById("errorMessage").style.display = "block";
        var uiStrings = UIStrings().getLocaleStrings(Office.context.displayLanguage);
        document.getElementById("errorMessage").innerText = uiStrings.UnexpectedErrorMessageLabel;
        dialog.close();
    }
    else {
        dialog = asyncResult.value;
        dialog.addEventHandler(Office.EventType.DialogMessageReceived, messageHandler);
    }
}

function messageHandler(arg) {
    if ('Yes' == arg.message) {
        var selectedCboxes = getSelectedCheckBox("chkFile");
        for (var k = 0; k < selectedCboxes.length; k++) {
            callBackEnd(selectedCboxes[k].id);
        }
        dialog.close();
    } else if ('No' == arg.message) {
        dialog.close();
    }
}

对话框自身代码

import { UIStrings } from './uiStrings';

if (!window.Promise) {
    window.Promise = Office.Promise;
}

var uiStrings = {};
Office.onReady((info) => {
    uiStrings = UIStrings().getLocaleStrings(Office.context.displayLanguage);
    setPageTranslatedLabels();
});

function setPageTranslatedLabels() {
    document.getElementById("btnYes").value = uiStrings.YesButtonLabel.toUpperCase();
    document.getElementById("btnNo").value = uiStrings.NoButtonLabel.toUpperCase();
    document.getElementById("lblConfirm").innerHTML = uiStrings.ConfirmMessageLabel;
}

async function yesOption() {
    Office.context.ui.messageParent(uiStrings.YesButtonLabel);
}

async function noOption() {
    Office.context.ui.messageParent(uiStrings.NoButtonLabel);
}

window.yesOption = yesOption;
window.noOption = noOption;

解决建议

1. 修复文本匹配不一致问题

对话框中yesOption传递的是本地化后的uiStrings.YesButtonLabel,但主页面messageHandler中硬编码判断'Yes'。如果你的插件支持多语言,这会导致匹配失败,触发后续逻辑异常。

修改主页面判断逻辑,与对话框使用同一字符串来源:

// 主页面先获取对应语言的字符串
const uiStrings = UIStrings().getLocaleStrings(Office.context.displayLanguage);

function messageHandler(arg) {
    if (arg.message === uiStrings.YesButtonLabel) {
        var selectedCboxes = getSelectedCheckBox("chkFile");
        for (var k = 0; k < selectedCboxes.length; k++) {
            callBackEnd(selectedCboxes[k].id);
        }
        dialog.close();
    } else if (arg.message === uiStrings.NoButtonLabel) {
        dialog.close();
    }
}

2. 等待异步请求完成后再关闭对话框

当前代码在循环调用callBackEnd后立即关闭对话框,网页版中Office.js上下文可能因对话框提前关闭而异常,触发5001错误。需要等待所有axios请求完成后再关闭:

async function messageHandler(arg) {
    if (arg.message === uiStrings.YesButtonLabel) {
        var selectedCboxes = getSelectedCheckBox("chkFile");
        // 用Promise.all等待所有删除请求完成
        await Promise.all(selectedCboxes.map(item => callBackEnd(item.id)));
        dialog.close();
    } else if (arg.message === uiStrings.NoButtonLabel) {
        dialog.close();
    }
}

同时确保callBackEnd返回axios的Promise:

function callBackEnd(id) {
    // 返回axios请求的Promise,让Promise.all能等待
    return axios.delete(`/api/your-delete-endpoint/${id}`)
        .then(res => {
            // 处理成功逻辑
        })
        .catch(err => {
            console.error('删除失败:', err);
            throw err; // 抛出错误避免Promise被吞
        });
}

3. 明确设置对话框的targetOrigin

网页版对跨域限制更严格,在displayDialogAsync中明确指定targetOrigin为当前域:

Office.context.ui.displayDialogAsync(url, {
    height: 10,
    width: 20,
    displayInIframe: true,
    targetOrigin: window.location.origin // 明确指定当前域
}, dialogCallback);

4. 检查Office.js版本兼容性

尽管Manifest设置了DefaultMinVersion为1.8,网页版可能加载的Office.js版本存在兼容问题。尝试在插件页面中强制加载指定版本的Office.js:

<script src="https://appsforoffice.microsoft.com/lib/1.8/hosted/office.js"></script>

内容的提问来源于stack exchange,提问作者user4676827

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 04:13:27