从node.js中的axios实用程序获取pdf

up9lanfz  于 2022-11-05  发布在  iOS
关注(0)|答案(1)|浏览(77)

我已经创建了一个实用函数,它应该是node.js express应用程序中所有api请求的通用函数。

function axiosCall(method, endpoint, body) {
    let requestConfig = {
        url: encodeURI(`${endpoint.host}:${endpoint.port}${endpoint.path}`),
        method: method,  //can be POST, GET, etc
        proxy: false,
        data: body,
        headers: {
            "x-access-token": token,
            "X-Correlation-ID": correlationId,
            "Content-Type": "application/json"
        },
    }
    axios.request(requestConfig).then(response => {
        return response.data;
    }).catch((errorRes) => {
        throw { 
            error: errorRes.message, status: errorRes?.response?.status || 500, 
            responseContent: errorRes?.response?.data || "Server Error" 
        };
    })
}

它可以很好地处理JSON响应,但不能为文件(如pdf)给予正确的结果。
我得到的pdf文件的响应是这样的

{
    "status": 200,
    "statusText": "OK",
    "headers": {
      "server": "nginx/1.16.1",
      "date": "Fri, 02 Sep 2022 07:39:44 GMT",
      "content-type": "application/pdf",
      "content-length": "47658",
      "connection": "close",
    },
    "config": {...},
    "request": {...},
    "data": "%PDF-1.4\r\n%����\r\n1 0 obj\r\n<<\r\n/Type /Catalog\r\n/Pages 2 0 R\r\n/AcroForm 3 0 R\r\n>>\r\nendobj\r\n4 0 obj\r\n<<\r\n/�����M��0\u0010��B�C������\u0016�@?���`��\u0003�N���\u0012���~�L��\u001e| O2�y3���;�fP�o�\u0013\u000e�Ҹ�c��}����E�VuS\r�W��Vv�h�>=�\u0001oGwi�j�⯰�\u000f����=�,��5��]��g{�ŧ{���\rݠ\u0012\u0000U�%��Vv��\rUL5�c\u001d���1\u000f\u0015�'�\u001f\u001d*M��jk컲B_�+N�U�$\u0019\u0004�-L\"t��\u0001�s���Z��\t�*MA����\u0005a���h�4O�\u0006�)H�9\bm�j\u0001BkX-Ah-+��i�wm@h\u0017�� �KV{\u0010�\r�\u0003\b햔I@hw��a�嶍\u0006�=��@Xp^��c\u0016ܣ1 ,4+N�Xp^!#a���X�\u0005�c8Ob�Il薑:IC�᭟oJ�\u001e�3����އy�\t�A\u001aG�q(C޵�X��7��\u0000�t��\r\nendstream\r\nendobj\r\n26 0 obj\r\n<<\r\n/Type /Font\r\n/Subtype /CIDFontType2\r\n/BaseFont /GBMOJY+SymbolMT\r\n/CIDToGIDMap /Identity\r\n/DW 1000\r\n/FontDescriptor 31 0 R\r\n/CIDSystemInfo <<\r\n/Registry (Adobe)\r\n/Ordering (Identity)\r\n/Supplement 0\r\n>>\r\n\r\n/W [120 [459]]\r\n>>\r\nendobj\r\n27 0 obj\r\n<<\r\n/Filter /FlateDecode\r\n/Length 225\r\n>>\r\nstream\r\nx^m�ϊ�0\u0010��\u001c� �^�P\n�\"����\u0000i2-��$L�C�~�T\u0014\u0016\u000f\u0019\u0018~�\r_F��sE6��a�k\f�Z2��\u001bY#4�Y\u0012�\u001d\u0018�\u0003,]��W>\u00133]OC����AQ���t\b<��ø\u0006��\r17~��0CM`\u001f��+��W�la��B��6\u000f��6l�$�֥�n��J�K���S[~ݤ�\u0003�5�]}ր����TV���ճG��Di���xQa� ?�K��\r�����ސmT�}q��Ԙ��\u0019�֕�\u0018c�\u0001�\u001a|/}!��qfJў<y��\u0007c��y\t\u001c\b ks]v]Fmz弦o\u0019����u�v_�|�[_F>�G�w�m:n��.�m$�ZҨ�F-i�\u0014〯�o\u001c�\u00120fJ\u0012`��Oz��{rP�v\u0011\u0004�}�����\u001d�\u0016�L\\�\u000b�\u001d�n�C]�I�����MZ�~۷��Iu��\u0014�6o�?�����W��ꡦ@?ZXG��wL�\u0007���G\t���3�Y���DFl�����R� 34\r\n>>\r\n\r\nstartxref\r\n46886\r\n%%EOF\r\n"
}

我无法将此www.example.com转换response.data为PDF文件。
然后我读到了关于设置responseType: "arraybuffer"的内容,它给出了buffer[],我可以在代码中使用它来生成文件。但是在设置responseType时,错误也是buffer类型而不是json。这同样需要进一步处理,将其转换为json格式。
那么,是否有一种方法可以通过转换www.example.com从axios获取PDF文件response.data,我使用默认的responseType接收到了该文件。
或者我们可以在从服务器获得响应后动态地设置responseType,就像我在头中获得content-type一样,以便创建一个可以处理所有类型响应的实用函数。

cedebl8k

cedebl8k1#

正如在这个问题(https://stackoverflow.com/a/53230807/19179818)中提到的,你可以在你的.then()中放入代码,在你的页面上创建一个锚标记,然后单击它自动下载文件,并在之后删除该标记。

相关问题