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

为何Express.js通过Axios响应渲染出空白PDF文件?

问题:Express.js返回空白PDF而非目标文件

以下是我编写的代码:

const axios = require('axios');
const express = require('express');

const app = express();

app.get('/', async (request, response) => {
  const {
    params: { accountId },
  } = request;

  try {
    const { data } = await axios.get('https://pdfobject.com/pdf/sample.pdf');

    response.setHeader('content-type', 'application/pdf');
    response.setHeader('content-type', 'application/pdf');
    response.send(Buffer.from(data, 'binary'));
  } catch (error) {
    console.log(error.message);
  }
});

app.listen(3000, () => {
  console.log(`Server app listening on port 3000`);
});

为何Express.js渲染出空白PDF文件,而非目标文件https://pdfobject.com/pdf/sample.pdf?


问题根源

axios默认会把响应内容解析为UTF-8编码的字符串,但PDF属于二进制文件,用文本编码解析二进制数据会直接导致字节丢失或损坏,后续再转成Buffer也无法恢复原始的PDF结构,最终返回的自然是空白文件。另外代码里重复设置了两次content-type头,属于冗余操作,虽不影响功能但没必要。

修复方案

在axios的请求配置里加上responseType: 'arraybuffer',让axios直接返回原始的二进制数组缓冲区,跳过文本解析步骤,就能完整拿到PDF的二进制数据。

修改后的代码:

const axios = require('axios');
const express = require('express');

const app = express();

app.get('/', async (request, response) => {
  const {
    params: { accountId },
  } = request;

  try {
    // 添加responseType配置,直接获取二进制数据
    const { data } = await axios.get('https://pdfobject.com/pdf/sample.pdf', {
      responseType: 'arraybuffer'
    });

    response.setHeader('content-type', 'application/pdf');
    // 直接发送二进制数据,无需额外转换
    response.send(data);
  } catch (error) {
    console.log(error.message);
    // 建议补充错误响应,告知客户端请求失败
    response.status(500).send('获取PDF文件失败');
  }
});

app.listen(3000, () => {
  console.log(`Server app listening on port 3000`);
});

额外说明

  • 移除了重复的content-type头设置,精简代码。
  • 直接返回axios拿到的arraybuffer数据,Express可以直接处理该类型,不需要再用Buffer.from转换。
  • 补充了错误响应逻辑,避免客户端收到空白响应却不知道原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:40:04