следующий JS: asyn c getInitialProps () с AWS S3? - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь запустить s3.getObject () внутри функции asyn c getInitialProps () в следующем JS проекте, но я не могу из-за этого понять, как получить предварительно подготовленные результаты могут быть возвращены как объект (который необходим для правильной работы getInitialProps () и следующего JS 'SSR).

Вот код:

static async getInitialProps({ query }) {
  const AWS = require('aws-sdk');
  const s3 = new AWS.S3({
    credentials: {
      accessKeyId: KEY
      secretAccessKey: KEY
    }
  });

  // The id from the route (e.g. /img/abc123987)
  let filename = query.id;

  const params = {
    Bucket: BUCKETNAME
    Key: KEYDEFAULTS + '/' + filename
  };

  const res = await s3.getObject(params, (err, data) => {
    if (err) throw err;
    let imgData = 'data:image/jpeg;base64,' + data.Body.toString('base64');
    return imgData;
  });

  return ...
}

Идея состоит в том, чтобы извлечь изображение из S3 и вернуть его в виде кода base64 (просто чтобы прояснить ситуацию).

1 Ответ

1 голос
/ 05 февраля 2020

Из вашего кода s3.getObject работает с обратным вызовом. вам нужно подождать, пока будет вызван обратный вызов.

Этого можно добиться, преобразовав этот обратный вызов в обещание.


static async getInitialProps({ query }) {
  const AWS = require('aws-sdk');
  const s3 = new AWS.S3({
    credentials: {
      accessKeyId: KEY
      secretAccessKey: KEY
    }
  });

  // The id from the route (e.g. /img/abc123987)
  let filename = query.id;

  const params = {
    Bucket: BUCKETNAME
    Key: KEYDEFAULTS + '/' + filename
  };

  const res = await new Promise((resolve, reject) => {
    s3.getObject(params, (err, data) => {
      if (err) reject(err);
      let imgData = 'data:image/jpeg;base64,' + data.Body.toString('base64');
      resolve(imgData);
    });
  });


  return ...
}
...