将 Node.js 请求外部网站的图像并发送回前端。

3

我正在使用nodejs作为服务器。

我需要在后端请求url以获取jpg、png等图像,并将响应发送给我的angular前端。

我尝试了下面的方法,但它不起作用。当我使用Postman进行测试时,屏幕上只显示文本,没有图像。

我做错了什么?

//node

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)
              }
        })

显示在图片位置的文本是什么?你能发布它吗? - Xavier
出于好奇,为什么您想让后端从外部URL获取图像,而不是直接从前端获取? - RaphaMex
此外,Postman 不会知道您的端点正在返回图像,因为它没有扩展名。它将输出图像的原始数据。即使它有扩展名,我也不确定 Postman 是否能够处理非文本响应。 - Xavier
@RaphaMex 我正在尝试将我的后端Node服务器用作代理,从Firebase获取图像。如果我从前端正确执行此操作,我会遇到CORS来源错误。 - Luiz Alves
@Xavier 这是 Firebase 存储中图像的 URL。 - Luiz Alves
显示了一个类似于 "{"statusCode":200,"body":"����\u0000\u0010JFIF\u0000\u0001\u0001\u0000\u0000\u0001\u0000\u0001\u0000\u0000��\u0000�\u0000\t\u0006\u0007\u0012\u0012\u0012\u0015\u0013\u0013\u0012\u0015\u0016\u0015\u0015\u0017\u0015\u0015\u0018\u0017\u0015\u0015\u0015\u0015\u0018\u0016\u0018\u0018\u0018\u0016\u0018\u0018\u0017\u0015\u0017\u0018\u001d( \u0018\u001d%\u001d\u0017\u0015!1!%)+...\u0017\u001f383-7(-.+\u0001\n\n\n\u000e\r\u000e\u001b\u0010\u0010\u001a-\u001f\u001f%--+----------------------------+-----------------+��\u0000\u" 的内容。 - Luiz Alves
1个回答

3
由于您的端点没有扩展名,您需要在响应中设置Content-Type头以匹配所获取的图像的MIME类型。可能通过从您的Google存储响应中程序化地检测它来实现。您还需要确保使用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');
    }
  }
});

没有这个Postman或任何浏览器都不会知道它是一张图片,也不知道它是什么类型的图片,因此它会认为它是纯文本。

这里有三个重要的内容:

  1. request 上指定 encoding: null 选项,以便将body加载为Buffer
  2. res.contentType设置为来自Firebase响应的内容类型
  3. 使用res.end(resp.body,'binary') 在express响应中指定二进制数据。

嗨,它不起作用。这是正确的网址:https://firebasestorage.googleapis.com/v0/b/ortototem.appspot.com/o/Photos%2F51%2FFoto?alt=media&token=bc891a7c-4b54-4b52-8276-4fec6f57d030 如果你将其粘贴到postmon中,图像将正确显示。 - Luiz Alves
嘿@LuizAlves,我刚刚更新了我的答案。它在我的机器上使用一个迷你express脚本运行。如果可以,请告诉我! - Xavier
非常感谢您,Xavier先生。我卡在这里了,你救了我。 - Luiz Alves

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接