【问题标题】:How to return a simple image from external API using NestJs?如何使用 NestJs 从外部 API 返回简单图像?
【发布时间】:2020-04-24 06:28:36
【问题描述】:

我使用这个新框架已经有一段时间了,用它编写代码很有趣,但是我遇到了麻烦并且卡住了,所以我在这里寻求一些帮助:)

我猜我的问题在其他框架或语言中很常见。我需要从外部 API 获取图像,例如调用以下 URL:

https://s2.coinmarketcap.com/static/img/coins/32x32/1.png

但是有一个小问题,在我最终的应用程序中我不知道我正在寻找的图像的 id 是什么,看到上面的 url 的末尾有一个数字 + ".png" 这个数字在这种情况下是加密货币的 id。所以,如果我想获得这个标志/图像只知道加密货币的名称,我必须查询另一个 URL 并搜索它的 ID,这不是问题,而且我实际上很容易做到:

public getImageByName(name: string): Observable<any> {
    return this.fetchCMCFullData()
      .pipe(
        map(entry => {
          return Object.keys(entry)
            .map(entradaKey => {
              return entry[entradaKey];
            })
            .find(valorMapeado => valorMapeado.slug == name);
        }),
      )
      .pipe(
        mergeMap(resultado =>
          this.httpService
            .get(
              'https://s2.coinmarketcap.com/static/img/coins/32x32/' +
                resultado.id +
                '.png',
              {
                headers: {
                  'Content-Type': 'image/png',
                },
              },
            )
            .pipe(map(response => response.data)),
        ),
      );
  }

您可能理解,“fetchCMCFullData”返回给我获取加密的 id 所需的数据,然后我查询它的图像,我的问题是我收到的不是图像,是一个大的一杯像这样的二进制通心粉:

�PNG


IHDR  D���gAMA���asRGB���PLTELiq���F��A����<����U�(����"��5��D��>����F��8��3��!��#��B��C��C��E��H��?��B��#��'��#��%��"�U��$��'���!��G��(��'��3��E��?��I��G��L��J��K��Q��K��J��K��*��@��;��1��9��;��5��/��=��6��;��;��+��-��1��.��)������������������F�� ��$��$�� ��J��I������K��8��L��-����)��-��M��L������-������)��.��8�����������2��3��8��:��C�� ��F��0��"��5��>��5��<��'��,��(��+��;��$��D�������%��*��/��A��E��@��4��)��&��������.��A����?�������K��@��*��!��&��I��.����B����#�������������!��G��/��O��;��9��e��y���ٯ�����u�����b��E��H��D��&��#��E��"����5��%��J��L��H��K��M��9��<��A��1��8��<��0��+����$������߼�ϙ�М�֩�ԣ�Ă�̒��o��Q�޺����ʎ��w�ƅ�����Y����Ɔ��0��5��1��������������������ح��7�զ�����M�޺����������V��8�����~��P�͕����џ�����T�Ƈ����m�����]���۳#�jtRNS��    ��������%''�&3���3������
���������+���������`����������֛������`(���Ό�����a���``��+`������,��VY5eIDAT8�U�uXSQ���    ��������`ww��±R���1`0�Al������8�^g�����{�=�� ���L�Ե{�NݻΚ��E�p�ع��];���m۹k{��Ii����v��u�������#��8�rO�$^��.�$��:��r�%��hcy��X�u
��4pX�Ma�f�.4��k�����;��h4V��Wx��5g��r����|���(9...٤��9�N�E�[   �hS;�<{�h���_�I��EjHU��'
��ޞ"��a��_�+W ��깷�G�>+HD�*�
�QT\�pD������/���A���ܹ ���@o�<��CQy.��I�t&P����E�����b���j�e� ����X����V��)dε>�T>գ�JQ���Qvt����JNBw�7I��"%K�A��\�Ǭ*e{A� >�-��r�>�W�>(5'đ��
���j�� +y��yq�,�$*C�XS�C$�A����H%?�Q��(��uH�B��>P&������.S��z.�{E�>A�U������1�P�J%k/��B|�
�lt|�D�RZ���F*���-��rK�����#*,ۤ���m[���b�!�(^�[��z�4O��O˶l�#|S�Y�J���8�]B׿$>��$��Y�/��-c64]�Ɋze�|�-�b!�+�n�hA'~�����,�=�Qm�
(�otfS�S�8����rY\��K��5չ  ��j��n��2�r9��U�t�oŶ�D�մ٩C"�L��Ɍ��:qB��99�K�gfΰ�2gf�ϛ�������×6x���O�Q�/׸���1­IEND�B`�

我一直在尝试使用响应标头和更多参数,但我无法实现,所以请帮忙:(

我的控制器方法如下:

@Get('getExchangeIMG/:exchangeName')
  returnExchangeIMG(@Param('exchangeName') exchName) {
    return this.exchangeCordinatorService.getImageByName(exchName);
  }

提前打个招呼

【问题讨论】:

标签: javascript node.js nestjs


【解决方案1】:

经过几天的研究,我发现了这个问题,NestJs 用于请求的底层库 axios-http 存在问题,它将所有内容保存在 JSON 中,所以如果我想获得二进制代码image 它会将它作为字符串保存在 JSON 中,并会破坏二进制文件。

要解决这个问题,我们必须将 JSON 上的已解析二进制文件解析为 Buffen,然后将其转换为 base64,例如:

 res.send({
                imagen: Buffer.from(response.data, 'binary').toString(
                  'base64',
                ),
                extension: 'base64',
              }),

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 2021-05-19
    • 1970-01-01
    • 2020-06-08
    • 2019-10-29
    • 2021-04-16
    • 1970-01-01
    相关资源
    最近更新 更多