Express - 从远程Web服务返回二进制数据

Var*_*kal 11 pdf binary node.js express

我尝试用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);
        }
    );
});
Run Code Online (Sandbox Code Playgroud)

根据我在这里看到的内容:https://github.com/strongloop/express/issues/1555

但是,我得到一个pdf文件,页面数量正确,标题正确....但所有页面都是空白的

我确定关注getBinaryData()的返回,因为这个函数询问了外部Web服务,当我直接询问这个服务时,我得到了正确的文档.

提前感谢您的回答

Mic*_*sin 29

这是我稍微清理过的如何使用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'));
};
Run Code Online (Sandbox Code Playgroud)

  • @realtebo,您可以使用Buffer.from()-有关更多示例,请参见Node.js文档。 (2认同)
  • `new Buffer()` 已弃用,请使用 `Buffer.from()` 代替。 (2认同)

Var*_*kal 21

我找到了一个更简单的解决方案

request(req.url).pipe(res);
Run Code Online (Sandbox Code Playgroud)

这将远程Web服务的原始响应直接传递给我的响应!无论文件类型如何,我都得到了正确的文件.

  • request lib 驻留在哪个库中以用于 request(req.url).pipe(res)? (6认同)
  • 对于每个想知道“request”来自哪个库的人来说,它是一个内置的节点模块,因此只需在调用之前添加“const request = require('request');”即可。 (3认同)