簡體   English   中英

如何解決nodejs + graphql上的異步s3解析器上傳?

[英]how to resolve async s3 resolver upload on nodejs + graphql?

我想要做的是首先上傳圖像,然后將鏈接保存到數據庫中的用戶。

這是我的 graphql 旋轉變壓器:

resolve: async (_root, args, { user, prisma }) => {

        ....

        const params = {
          Bucket: s3BucketName,
          Key: fileName,
          ACL: 'public-read',
          Body: file.createReadStream(),
          ContentType: file.mimetype,
        };
        return s3.putObject(params, async function (error, data) {
          if (error) {
            return {
              message: error,
              success: false,
            };
          } else {
            // user has updated
            if (user.profileImg)
              return prisma.user
                .update({
                  where: { id: Number(user.id) },
                  data: {
                    profileImg: fileName,
                  },
                })
                .then(
                  (response) => {
                    console.log('response: ', response);
                    return {
                      message: 'Success',
                      success: true,
                    };
                  },
                  (error) => {
                    return {
                      message: error,
                      success: false,
                    };
                  }
                );
            else {
              return {
                message: 'Success',
                success: true,
              };
            }
          }
        });
      },

我想要做的是從 s3 返回,但我的問題是我認為它在沒有此解決的情況下返回並返回 null 所以不返回 emmage 和成功。 如何使用 s3 構建 function 解析器?

您應該從解析器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周圍創建一個實用程序/promise-wrapper;

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM