使用Node.js通过Fetch实现本地视频链接下载的问题排查
问题分析与修改方案
你的代码存在几个核心问题导致无法实现视频下载:
- 错误地将视频二进制流尝试解析为JSON格式,这与视频数据的类型完全不匹配
- 未将获取到的视频流转发给客户端(直接return了JSON结果,没有利用
res对象输出响应) - 错误设置了
Content-Type: application/json请求头,视频下载请求不需要该头信息
以下是修改后的完整代码:
exports.getVideo = async (req, res) => { try { const path = process.env.APP_LOCALHOST_URL + urlDirectDownloadVideo(req.query); const response = await fetch(path, { method: 'GET', headers: { 'Authorization': `Bearer ${req.query.token}` // 移除错误的Content-Type: application/json头 }, }); // 检查请求是否成功 if (!response.ok) { throw new Error(`请求失败: ${response.statusText}`); } // 从原响应获取视频的Content-Type,若获取失败则手动指定为通用视频类型 const contentType = response.headers.get('Content-Type') || 'video/mp4'; // 设置响应头,触发浏览器的下载行为 res.setHeader('Content-Type', contentType); res.setHeader('Content-Disposition', 'attachment; filename="video.mp4"'); // 将fetch获取的二进制流直接转发到客户端响应 await response.body.pipeTo(res); } catch (error) { res.status(500).json({ error: error.message }); } };
关键改动说明
- 移除错误请求头:删掉
Content-Type: application/json,视频下载请求不需要告知服务器期望JSON格式的数据。 - 处理二进制流而非JSON:不再使用
response.json(),直接操作响应的body(可读流),通过pipeTo将流转发给客户端的res对象。 - 设置客户端响应头:
Content-Type:告知浏览器返回数据为视频类型Content-Disposition: attachment:强制浏览器触发下载弹窗,若需要直接播放视频可改为inline
- 增加错误处理:用try/catch捕获请求过程中的异常,返回标准的错误响应。
另外需要注意:如果urlDirectDownloadVideo函数生成的查询参数包含特殊字符(比如示例中的password=admin*),要确保函数做了正确的URL编码,避免请求出错。
内容的提问来源于stack exchange,提问作者jhon estrada
相关产品推荐
相关产品推荐

