gpt4 book ai didi

javascript - 通过 Node js 将来自 python flask 的响应转发给客户端

转载 作者:行者123 更新时间:2023-11-30 20:44:22 25 4
gpt4 key购买 nike

在特殊情况下,我的node js后端收到了来自python flask server的响应。

我需要将此响应转发回客户端(作为对客户端执行的操作的响应)。

响应应开始在客户端浏览器上下载 python flask 响应正文中指定的文件。

python flask的响应返回行:

返回 flask.send_file(download_path, as_attachment=True, attachment_filename=file)

我在我的 Node 服务器回调中得到了这个响应:

app.get(constants.routes.files.download, function (req, res) {
fileController.downloadFile(req, (err, response_from_python) => {

console.log("Response from python flask has arrived")
res._headers = response_from_python.headers;
res.set('Content-Disposition', 'attachment; filename=exmp_word.docx');
return res.json(response_from_python.body)

});

这确实触发了客户端浏览器的下载,但文件已损坏且无法用 word 打开(它是用 word 创建的..)。我认为这与文件在响应正文中的编码方式有关(我应该使用 res.json 吗?)。

此外,如果我从客户端直接连接到 python 服务器(不通过 Node ),那么文件下载成功(未损坏)但这不是它应该工作的方式(应该通过 Node 服务器在中间)。

我应该怎么做?

有没有办法将 python 响应对象直接传递给客户端,而无需将其主体字段复制到 Node res 对象并修改 header ?

编辑:

感谢 Ivan Velichko,我正在工作。

这是修改后的函数(我必须更好地构建它,但功能存在)。

app.get(constants.routes.files.download, function (req, res) {


res.set('content-Disposition', 'attachment; filename=noam_susp.docx');
res.set('content-type', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document');
res.set('Accept-Ranges', 'bytes');
res.set('Cache-Control', 'public, max-age=0');
res.set('ETag', 'W/"2721-161b23de2ee');



var file_hash = req.params.identifier;

var request = http.get(constants.manager_rest_api.base_url +
constants.manager_rest_api.get_file_endpoint +
'/' + file_hash + '/download_inner', function(response) {
response.pipe(res);
});

最佳答案

看起来你的解决方案向 python 服务器发出请求,然后读取内存中的整个文件内容,然后出于某些原因尝试将其发送回客户端 res.json() .但是,很可能您只需要将客户端的请求转发到 python 服务器,然后按原样转发 python 的响应。你肯定不应该在你的 Node 服务器上下载文件。而是使用 streams .像这样的东西:

app.get(constants.routes.files.download, function (req, res) {
fileController.downloadFile(req).pipe(res);
});

要实现此行为,您的 fileController.downloadFile() 应该返回一个可读流,然后您可以 pipe()resres 本身已经是一个可写流。

UPD:重要的是在将 python 的响应的 header 复制到 Node 的响应之前,然后在其中进行管道传输。

关于javascript - 通过 Node js 将来自 python flask 的响应转发给客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48887233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com