Возвращение блоба через Метеор всегда приводит к пустому объекту - PullRequest
2 голосов
/ 16 марта 2020

Таким образом, приведенный ниже код является телом функции на стороне сервера, которую я позже использую на стороне клиента того же приложения:

const fetch = require('node-fetch');

async function fetchImage(url) {
  // url: image file url like: http://example.com/img1.png
  const res = await fetch(url);

  const blob = await res.blob();

  console.log(blob);
  /* logs a blob successfully 
  Blob {
  I20200316-01:00:19.551(2)?   [Symbol(type)]: 'image/jpeg',
  I20200316-01:00:19.551(2)?   [Symbol(buffer)]: <Buffer ff d8 ff e0 00 10 
  4a 46 49 46 00 01 01 01 00 60 00 60 00 00 ff e1 0e d2 45 78 69 66 00 00 
  4d 4d 00 2a 00 00 00 08 00 0c 01 00 00 03 00 00 00 01 03 e8 ... 133125 
  more bytes>
  */

  return blob;
  // this however will ALWAYS return {} empty object
}

Я попытался сделать что-то вроде return 'Hello Bros!' только для моего здравого смысла, и он потребляется должным образом.

Это просто блоб, который не вернется, несмотря ни на что.

Я в основном пытаюсь прокси-вызов на стороне сервера чтобы получить некоторые изображения, которые я могу отобразить в браузере.

Функция вызывающего абонента

async function getImageBlob(url) {
    const res = await fetchImage(url);
    console.log(res, 'response which is always {} instead of my precious blob');
  }

Полная более длинная версия

сервер

Meteor.methods({
  async 'products.fetchImage'(url) {
    check(url, String);

    const res = await fetch(url);
    const blob = await res.blob();
    console.log(blob, '!!!server blob!!!'); // logs just fine
    return blob;
  }
})

клиент

// image uploader
import vueFilePond, { setOptions } from 'vue-filepond';

setOptions({
  server: {
    // initialize image uploader with images already stored on the server
    load: async (source, load) => {
      // source: 'http://example.com/img1.png'
      const response = await meteorCall('products.fetchImage', source);
      console.log('blob?', response); // logs {}
      load(response);
    },
  },
});
const FilePond = vueFilePond();
...