Express - 从 Web 服务返回二进制数据
Posted
技术标签:
【中文标题】Express - 从 Web 服务返回二进制数据【英文标题】:Express - Return binary data from webservice 【发布时间】:2015-07-24 14:55:54 【问题描述】:我尝试使用 Express 返回一些二进制数据。在示例中,它是 PDF,但理论上,它可以是任何类型的文件。
但现在只关注 pdf。我写了这段代码:
app.get('*', function (req, res)
getBinaryData(req.url,
function (answer)
res.type('pdf');
res.end(new Buffer(answer, 'binary'));
,
function (error)
res.setHeader('Content-Type', 'text/plain');
return res.end(error);
);
);
根据我在这里看到的:https://github.com/strongloop/express/issues/1555
但是,我得到了一个页数正确的 pdf 文件,正确的标题....但是所有页面都是空白的
我很担心 getBinaryData() 的返回,因为这个函数请求了一个外部 Web 服务,当我直接请求这个服务时,我得到了正确的文档。
提前感谢您的回答
【问题讨论】:
为什么不用res.sendFile
方法?
因为我没有该文件:我从另一个 WebService 获取此二进制内容。最终,我可以创建一个临时文件并使用 sendFile...
【参考方案1】:
我找到了一个更简单的解决方案:
request(req.url).pipe(res);
这会将来自远程 Web 服务的原始响应直接传递给我的响应!无论文件类型如何,我都得到了正确的文件。
【讨论】:
我尝试了同样的事情,但它不适合我。 ***.com/questions/37517312/… request(req.url).pipe(res)的request lib驻留在哪个库中? 大家都想知道request
来自什么库,它是一个内置的节点模块,所以在调用之前添加const request = require('request');
。【参考方案2】:
这是我稍微清理过的如何使用 Express 返回二进制文件的版本。我假设数据在一个可以声明为二进制且有长度的对象中:
exports.download = function (data, filename, mimetype, res)
res.writeHead(200,
'Content-Type': mimetype,
'Content-disposition': 'attachment;filename=' + filename,
'Content-Length': data.length
);
res.end(Buffer.from(data, 'binary'));
;
【讨论】:
轻微错字。应该是:res.end(new Buffer(data), 'binary')
请记住 new Buffer() 已被弃用,它存在安全问题。
@realtebo 您可以使用 Buffer.from() - 有关更多示例,请参阅 Node.js 文档。
new Buffer()
已弃用,请改用Buffer.from()
。
为什么在数据是二进制时使用 Buffer.from,那不是为字符串保留的吗?你不需要使用 Buffer.alloc 吗?以上是关于Express - 从 Web 服务返回二进制数据的主要内容,如果未能解决你的问题,请参考以下文章
无法从 Web 服务器连接到 SQL Server Express
服务器未将 JSON 从 Express 返回到 React(代理)
详解express搭建http服务,通过路由和中间件获取静态文件和动态数据的实现原理
如何让服务器将远程 json 对象返回给客户端?反应/快递/web3