javascript - 如何解决nodejs + graphql上的异步s3解析器上传?

标签 javascript node.js 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 构建函数解析器?

最佳答案

您应该从解析器返回新的Promise,而不是使其异步,这样您可以显式resolve()从嵌套回调中拒绝()

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 包装器;

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

关于javascript - 如何解决nodejs + graphql上的异步s3解析器上传?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62102714/

相关文章:

javascript - 如何按后缀/扩展名过滤所有 gulp 任务?

javascript - jQuery DatePicker 设置时间和日期

JavaScript 原型(prototype)为空变量

amazon-web-services - 使用 AWS AppSync 进行输入验证

graphql - 如何在 GraphQL 中返回一个对象或 null?

javascript - JS : Getting the subsequent k items 中的初学者 Firebase

javascript - 图片展开用jQuery动画推别人

javascript - 接近堆限制的无效标记压缩分配失败 - JavaScript 堆内存不足

javascript - 什么可能导致socket.io服务时间过长?

react-native - 如何将参数传递给graphql片段?