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

Fastify代理请求返回Fetch流为空问题求助

Fastify代理响应流返回空内容的问题

我用Fastify搭建服务器,需要将请求代理至其他服务,但尝试直接返回获取到的响应流时,客户端收到的响应内容为空对象{}。以下是使用Star Wars API(SWAPI)编写的示例代码:

const fastify = require("fastify")({ logger: true });

// 返回JSON正常工作
fastify.get("/api/json", async (request, reply) => {
  const response = await fetch("https://swapi.dev/api/people/1/");
  const json = await response.json();
  return reply.send(json);
});

// 返回流无法正常工作,响应为空对象:{}
fastify.get("/api/stream", async (request, reply) => {
  const response = await fetch("https://swapi.dev/api/people/1/");
  return reply.send(response.body);
});

fastify.listen({ port: 3000 }, (err) => {
  if (err) {
    fastify.log.error(err);
    process.exit(1);
  }
});

问题原因与解决办法

原因

fetch返回的response.body是ReadableStream类型,但Fastify默认的reply.send无法直接正确处理这种流对象,同时缺少必要的响应头信息也会导致客户端无法解析内容。

解决方法

方法一:手动管道流并复制响应头

直接将上游响应流通过管道传递给Fastify的底层响应对象,同时复制原响应的Content-Type等关键头信息:

fastify.get("/api/stream", async (request, reply) => {
  const response = await fetch("https://swapi.dev/api/people/1/");
  // 复制原响应的内容类型头
  reply.header("Content-Type", response.headers.get("Content-Type"));
  // 将流管道到Fastify的原始响应对象
  return response.body.pipe(reply.raw);
});

方法二:使用官方代理插件(推荐)

对于代理场景,Fastify官方的@fastify/http-proxy插件已封装好流转发、头信息处理等逻辑,无需手动处理:

  1. 安装插件:
npm install @fastify/http-proxy
  1. 修改代码使用插件:
const fastify = require("fastify")({ logger: true });

// 注册代理插件
fastify.register(require("@fastify/http-proxy"), {
  upstream: "https://swapi.dev/api",
  prefix: "/api/proxy", // 本地代理路径前缀
  rewritePrefix: "/api" // 转发到上游时重写路径
});

fastify.listen({ port: 3000 }, (err) => {
  if (err) {
    fastify.log.error(err);
    process.exit(1);
  }
});

访问/api/proxy/people/1即可直接代理到SWAPI对应接口,自动处理流传输与响应头。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 22:50:12