как разрешить загрузку asyn c s3 resolver на nodejs + graphql? - PullRequest
2 голосов
/ 30 мая 2020

то, что я хочу сделать, это сначала загрузить изображение, чтобы сохранить ссылку для пользователя в базе данных.

Это мой преобразователь graphql: return from s3, но моя проблема в том, что я думаю, что он возвращается без этого разрешения и возвращает null, поэтому emmage и успех не возвращаются. как создать преобразователь функций с помощью s3?

1 Ответ

2 голосов
/ 30 мая 2020

Вы должны return new Promise из вашего преобразователя, вместо того, чтобы делать это async таким образом, вы можете явно resolve() или reject() из вложенного обратного вызова.

resolve: (_root, args, { user, prisma }) => {
  return new Promise((resolve, reject) => {
    s3.putObject(params, async (error, data) => {

      if (error) {
        return reject({
          message: error.message,
          success: false
        });
      }

      try {
        await prisma.user.update();

        return resolve({
          message: "Success",
          success: true
        });
      } catch (e) {
        return reject({
          message: e.message,
          success: false
        });
      }

    });
  });
};

Если вы хотите оставайтесь в парадигме async/await, создайте служебную программу / обещание-обертку вокруг s3.putObject;

function putObject(...params) {
  return new Promise((resolve, reject) => {
    s3.putObject(...params, async (error, data) => {
      if (error) {
        return reject(error);
      }

      return resolve(data);
    });
  });
}

resolve: async (_root, args, { user, prisma }) => {
  try {
    const response = await putObject(params);

    await prisma.user.update();

    return {
      message: "Success",
      success: true
    };
  } catch (error) {
    return {
      message: error.message,
      success: false
    };
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...