节点(快速) - 通过api

时间:2017-06-20 14:58:41

标签: node.js api express pdf axios

我有一个api,可以为我网站上的每笔付款生成发票。在另一方面,我有一个管理客户端的服务器。我需要在客户端要求时获取pdf。

我正在使用node / express和axios来管理http调用。

我设法使用以下代码从api发送pdf:

function retrieveOneInvoice(req, res, next) {
    Order
        .findOne({_id: req.params.id, user: req.user.id})
        .exec((err, order) => {
            if(err) {

            } else if (!order) {
                res.status(404).json({success: false, message: 'Order not found!'});
            } else {
                const filename = order.invoice.path;
                let filepath = path.join(__dirname, '../../../invoices' ,filename);

                fs.readFile(filepath, function (err, data){
                    res.contentType("application/pdf");
                    res.end(data, 'binary');
                });
            }
        });
}

该部分工作正常,我可以获取并保存pdf。此外,如果我打印数据,我得到一个如下所示的缓冲区:<Buffer 25 50 44 46 2d 31 2e 34 0a 31 20 30 20 6f 62 6a 0a 3c 3c 0a 2f 54 69 74 6c 65 20 28 fe ff 29 0a 2f 43 72 65 61 74 6f 72 20 28 fe ff 29 0a 2f 50 72 6f ... >

在我的客户端,我使用axios获取数据:

function retrieveInvoice(Config) {
    return function(orderId, done) {
        axios({
            url: `${Config.apiUrl}/invoices/${orderId}`,
            method: 'get'
        }).then(
            (res) => { return done(null, res.data) },
            (err) => { return done(err) }
        )
    }
}

最后,我尝试通过调用上一个函数将其发送到客户端:

Api.retrieveInvoice(orderId, (err, data) => {
        if(err) {

        } else {
            res.contentType("application/pdf");
            res.end(new Buffer(data, 'binary'), 'binary');
        }
    });

这就是我遇到问题的地方。我总是收到空白页面。我尝试过使用和不使用缓冲区,如下所示:

res.contentType("application/pdf");
res.end(data, 'binary');

没有&#39;二进制&#39;参数。如果我在api和我的客户端都记录数据,我得到完全相同的缓冲区和二进制文件。正如我将它们发送给客户端的方式完全相同,我无法理解哪里可能是我的错误。

我希望我给了你足够的信息来帮助我,而且我遗失了任何东西,我将添加一些可以帮助潜在帮助者的信息。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

你试过这个吗?

您的axios请求:

numeric

和你的回调:

axios({
    url: `${Config.apiUrl}/invoices/${orderId}`,
    method: 'get',
    responseType: 'stream'
}).then(
    ...
)

You can find documentation on this here.

默认Api.retrieveInvoice(orderId, (err, data) => { if (err) { // handle error } else { res.contentType("application/pdf"); data.pipe(res); } }); responseType,因此更改此选项可以解决问题。