使nodejs向外部站点请求图像并发送回前端

时间:2018-01-10 18:02:05

标签: angularjs node.js

我正在将nodejs与服务器一起使用。 我需要在网址中执行后端请求以获取jpg,png ...图像并将响应发送到我的角度前端。

我尝试了下一个但它不起作用。 当我使用Postman进行测试时。屏幕上只显示文字。没有形象。

我做错了什么?

//节点

var request=require('request');
app.get('/foto', function(req, res, next) {
            request.get('https://firebasestorage.googleapis.com/v0/b/ortototem.appspot.com/o/Photos%2F51%2FFoto?alt=media&token=XXXXX',
                function(err,resp,body){
              if(err) {
                next(err)
              }else{ 
                 if(resp.statusCode !== 200 ) {
                    console.log(resp)
                 } else res.send(resp)
              }
        })

1 个答案:

答案 0 :(得分:3)

由于您的终端没有扩展程序,因此您必须在响应中设置Content-Type标头,以匹配您获得的图像的mime类型。可能通过编程方式从您的谷歌存储响应或其他东西检测它。您还需要确保传入并使用Buffer类型呈现二进制数据。

例如:

request.get('https://firebasestorage.googleapis.com/v0/b/ortototem.appspot.com/o/Photos%2F51%2FFoto?alt=media&token=YOUR_TOKEN', { encoding: null }, function(err,resp) {
  if(err) {
    next(err)
  } else {
    if(resp.statusCode !== 200 ) {
      console.log(resp)
    } else {
      res.contentType(resp.headers['content-type']);
      res.end(resp.body, 'binary');
    }
  }
});

没有这个邮递员或任何浏览器都不会知道它是一个图像或它是什么类型的图像所以它将假定它是纯文本。

这里有三个重要的项目:

  1. encoding: null上指定request选项,以便将主体加载为缓冲区
  2. res.contentType设置为等于Firebase响应中的内容类型
  3. 使用res.end(resp.body, 'binary')
  4. 在快速回复中指定二进制数据