Express HTTP请求处理程序,从另一个URL发送音频文件作为响应

Express HTTP请求处理程序,从另一个URL发送音频文件作为响应,express,http,google-cloud-functions,middleware,html5-audio,Express,Http,Google Cloud Functions,Middleware,Html5 Audio,我想允许用户请求音频文件。这些文件托管在单独的文件服务器上。我不希望用户获得这些文件,除非他们先通过我的服务器 如何创建一个基本上充当用户和文件服务器之间的中间人的函数。我现在有这样的东西: async(req,res)=>{ 常量媒体链接=`https://www.example.com/audio.mp3`; const mediaResponse=等待获取(mediaLink{ 标题:{ 范围:req.headers.Range, } }); const blob=wait mediaRe

我想允许用户请求音频文件。这些文件托管在单独的文件服务器上。我不希望用户获得这些文件,除非他们先通过我的服务器

如何创建一个基本上充当用户和文件服务器之间的中间人的函数。我现在有这样的东西:

async(req,res)=>{
常量媒体链接=`https://www.example.com/audio.mp3`;
const mediaResponse=等待获取(mediaLink{
标题:{
范围:req.headers.Range,
}
});
const blob=wait mediaResponse.blob();//我在这里猜。Idk。
res.send(blob);
}
我在
标签中对此进行了测试,但音频从未加载:


处理此类请求的正确方法是返回客户机,确保从文件服务器的响应中复制。请仔细阅读,了解您应该关注哪些用例(例如CORS)

async(req,res)=>{
常量媒体链接=`https://www.example.com/audio.mp3`;
//您可能希望传递与缓存相关的头,例如
//如果不匹配,如果匹配,如果修改自,如果范围,如果未修改自
const mediaResponse=等待获取(mediaLink{
标题:{
范围:req.headers.Range,
}
});
//注意:这当前从文件服务器传递正文和状态
//按原样,您可能希望将您自己的身体上的失败状态代码发送到
//隐藏外部服务器的存在(即自定义404页,无
//Nginx错误页等)
//mediaResponse.status可能是:
//-200(发送完整文件)
//-206(文件的发送部分)
//-304(如果使用缓存头,则未修改)
//-404(找不到文件)
//-412(前提条件失败,如果使用缓存标头)
//-416(范围不可满足)
//-5xx(来自文件服务器的内部服务器错误)
物件
.status(mediaResponse.status)
.设置({
/*…其他标头(例如CORS、缓存控制)*/
“内容类型”:mediaResponse.headers.get('Content-Type'),
“内容长度”:mediaResponse.headers.get('Content-Length'),
“内容编码”:mediaResponse.headers.get('Content-Encoding'),
'Etag':mediaResponse.headers.get('Etag'),//用于缓存
“Last-Modified”:mediaResponse.headers.get('Last-Modified')//用于缓存
});
mediaResponse.body.pipe(res);
}

您可能还希望了解可以为您处理正文和标题的各种方法。请注意,如果在Firebase云功能中用作请求主体,其中一些可能无法正常工作。

处理此类请求的正确方法是返回到客户端,确保在文件服务器的响应中复制。请仔细阅读,了解您应该关注哪些用例(例如CORS)

async(req,res)=>{
常量媒体链接=`https://www.example.com/audio.mp3`;
//您可能希望传递与缓存相关的头,例如
//如果不匹配,如果匹配,如果修改自,如果范围,如果未修改自
const mediaResponse=等待获取(mediaLink{
标题:{
范围:req.headers.Range,
}
});
//注意:这当前从文件服务器传递正文和状态
//按原样,您可能希望将您自己的身体上的失败状态代码发送到
//隐藏外部服务器的存在(即自定义404页,无
//Nginx错误页等)
//mediaResponse.status可能是:
//-200(发送完整文件)
//-206(文件的发送部分)
//-304(如果使用缓存头,则未修改)
//-404(找不到文件)
//-412(前提条件失败,如果使用缓存标头)
//-416(范围不可满足)
//-5xx(来自文件服务器的内部服务器错误)
物件
.status(mediaResponse.status)
.设置({
/*…其他标头(例如CORS、缓存控制)*/
“内容类型”:mediaResponse.headers.get('Content-Type'),
“内容长度”:mediaResponse.headers.get('Content-Length'),
“内容编码”:mediaResponse.headers.get('Content-Encoding'),
'Etag':mediaResponse.headers.get('Etag'),//用于缓存
“Last-Modified”:mediaResponse.headers.get('Last-Modified')//用于缓存
});
mediaResponse.body.pipe(res);
}

您可能还希望了解可以为您处理正文和标题的各种方法。请注意,如果在Firebase云函数中用作请求主体,其中一些可能无法正常工作。

谢谢!成功了!谢谢成功了!