当使用普通Javascript的Office.js工作时,带有React框架的Office.js为什么会破坏端点数据

问题描述 投票:0回答:1

我有两个Office.js应用程序:

  1. 使用纯JavaScript编写的原型
  2. 反应申请

我可以在下载MSWord文档的纯JavaScript应用程序中成功调用一个端点。该文件是完整,完整且未损坏的。

但是,React应用程序中几乎相同的代码,调用相同的端点,下载相同的MSWord文档将返回稍长的数据长度(42523与40554,数据开始相同,然后更改如下:

文档数据的工作片段80,75,3,4,20,0,6,0,8,0,0,0,33,0,70,117,100,65533,1,0,0,32,8,0,0,19,0, 8,2,91,67,111,110,116,101,110,116,95,84,121,...

文档数据片段损坏80,75,3,4,20,0,6,0,8,0,0,0,33,0,70,117,100,63462,63411,1,0,0,32,8,0,0,19, 0,8,2,91,67,111,110,116,101,110,116,95,...

在我的(运行中)纯JavaScript应用程序中,代码如下所示:

                        downloadPath = "https://myserver.com/seal-ws/v5/downloads/6bb4dfd7e0a528dc68f2069f9d5da5a732692f49";

                        var xhr = new XMLHttpRequest;
                        xhr.open("GET", downloadPath);
                        xhr.addEventListener("load", function () {
                            var ret = [];
                            var len = this.responseText.length;

                            let trace = '';
                            for (let i = 0; i < len; i += 1) {
                                trace += this.responseText.charCodeAt(i) + ",";
                            }
                            console.log(trace);
                            console.log(len);


                        }, false);

                        xhr.setRequestHeader("X-Session-Token", XSessionToken);
                        xhr.overrideMimeType("octet-stream; charset=x-user-defined;");
                        xhr.send(null);

在React应用程序中,返回损坏文件的代码如下:

        const downloadPath = "https://myserver.com/seal-ws/v5/downloads/6bb4dfd7e0a528dc68f2069f9d5da5a732692f49";

        const xhr = new XMLHttpRequest;
        xhr.open("GET", downloadPath);

        xhr.addEventListener("load", function () {
            const ret = [];
            const len = this.responseText.length;

            let trace = '';
            for (let i = 0; i < len; i += 1) {
                trace = `${trace}${this.responseText.charCodeAt(i)},`
            }
            console.log(trace);
            console.log(len);


        }, false);

        xhr.setRequestHeader("X-Session-Token", XSessionToken);
        xhr.overrideMimeType("octet-stream; charset=x-user-defined;");
        xhr.send(null);

我已经使用fiddlr来检查两个应用程序的传出请求,并且两者看起来结构良好且彼此相同。我不明白为什么在React应用程序中响应看起来像相同的代码一样被破坏了?

这与浏览器没有什么区别,因为我已经在两个应用程序上使用IE进行了测试。我唯一能想到的是,原型为XMLHttpRequest对象使用了不同版本的javascript文件。

纯Javascript应用程序:

C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ JavaScript \ References \ domWeb.js

反应应用程序:

C:\ Users \\ AppData \ Local \ Programs \ Microsoft VS Code \ resources \ app \ extensions \ node_modules \ typescript \ lib \ lib.lib.dom.d.ts

有什么想法吗?

以上是我试图实现的目的的简化版本,以说明两种方法之间的数据略有损坏。最终,我正在尝试下载MSWord文档,然后执行一个打开的新实例命令,如以下代码所述。如上所述,以下代码在原型纯javascript应用程序中运行,但是在React应用程序中有此轻微损坏。生成的文档可以通过纯JavaScript正确打开,并且无法从React应用程序中打开损坏的版本。我确定与React作为框架无关,但我努力了解可能存在哪些差异,从而导致生成的数据以这种方式被误解码:

        const downloadPath = "https://myserver.com/seal-ws/v5/downloads/6bb4dfd7e0a528dc68f2069f9d5da5a732692f49";
        const xhr = new XMLHttpRequest;
        xhr.open("GET", downloadPath);

        /* eslint-disable no-bitwise */
        xhr.addEventListener("load", function () {
            const ret = [];
            const len = this.responseText.length;
            console.log('len');
            console.log(len);
            let trace = '';
            for (let i = 0; i < len; i += 1) {
                trace = `${trace}${this.responseText.charCodeAt(i)},`
            }
            console.log(trace);

            let byte;
            for (let i = 0; i < len; i += 1) {
                byte = (this.responseText.charCodeAt(i) & 0xFF) >>> 0;
                ret.push(String.fromCharCode(byte));
            }
            let data = ret.join('');
            data = btoa(data);
            console.log(data);

            Word.run(context => {
                const myNewDoc = context.application.createDocument(data);
                context.load(myNewDoc);
                return context.sync().then(() => {
                    context.sync();
                    myNewDoc.open();
                });
            });                 

        }, false);

        xhr.setRequestHeader("X-Session-Token", XSessionToken);
        xhr.overrideMimeType("octet-stream; charset=x-user-defined;");
        xhr.send(null);
javascript reactjs office-js endpoint
1个回答
0
投票

由于产生不同输出的两个代码片段与React无关,请尝试复制粘贴使其在两个项目中具有相同的代码片段。

我想,问题是您这样做:

trace = `${trace}${this.responseText.charCodeAt(i)},`

重复trace值,而不是每次迭代都累积新字符的代码。

© www.soinside.com 2019 - 2024. All rights reserved.