节点(Express) - 尝试从API调用中保存PDF

时间:2017-03-21 11:40:06

标签: javascript node.js pdf express

我尝试了各种各样的方法来实现这一目标。我正在尝试从节点上的API请求PDF,然后将其发送回调用它的客户端。

我只想在节点服务器上成功保存和查看PDF。

问题是我打开它时PDF文件总是空的(即使它的大小为30kb)。

基本流程是这样的(删除了一些位,但下面的代码可以正常工作并将PDF返回给我)

logical

我尝试使用/不使用二进制标志进行保存,如文件中的其他帖子所示,以及请求本身。还尝试了各种类型的解码方法,我总是得到一个空的PDF保存。

我的返回数据看起来像这样(更大,当保存为test.pdf时我得到一个30kb文件,如前所述)

%PDF-1.4 % 1 0 obj  0 obj <

我发现了一篇文章,说明了如何管理数据,我感觉我的pdf_data在转换为字符串时已损坏

任何想法如何使用当前设置进行此操作?

e / RequestPromise是一个库,如果更容易也可以使用标准请求库

https://github.com/request/request-promise - https://github.com/request/request

谢谢!

1 个答案:

答案 0 :(得分:2)

您的代码无效,因为基础request库(由request-promise使用)要求encoding选项设置为null二进制数据 - 请参阅{{3 }}

以下是使用该模块下载二进制数据的方法 -

app.post("/getPayslipURL", function(client_request, res) {
    const NI_NUMBER_REQUEST = db_api.createRequestTemplate({
        body: JSON.stringify(client_request.body),
        encoding: null
    });

    requestPromise(NI_NUMBER_REQUEST)
        .then((db_response) => {   
            const PAY_API_OPTIONS = /*Code to generate options based on furhter DB info (Includes dates etc)*/
            return requestPromise(PAY_API_OPTIONS); // Call pay API
        })
        .then((pay_pdf_data) => { 
            fs.writeFile("./test.pdf", pay_pdf_data, 'binary', (err) => {
                if(err) {
                    return console.log(err);
                }
                console.log("The file was saved!");
            }); 
        })
        .catch(err => `Error caught: ${console.log}`) // Catch any errors on our request chain
    });
}