【问题标题】:how to resolve async s3 resolver upload on nodejs + graphql?如何解决nodejs + graphql上的异步s3解析器上传?
【发布时间】:2020-05-30 22:15:04
【问题描述】:

我要做的是先上传图片,然后将链接保存到数据库中的用户。

这是我的 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 构造函数解析器?

【问题讨论】:

    标签: javascript node.js graphql


    【解决方案1】:

    你应该从你的解析器中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
        };
      }
    };
    

    【讨论】:

    • 关于 .then 和 .catch 的问题,而不是 .then(() =>{}).catch(() => {}) 我可以用这个代替吗? .then(res=> { // 履行 }, error=> { // 拒绝 });
    • @gpbaculio 是的,.then() 的第二个参数可以用作异常处理程序。
    猜你喜欢
    • 1970-01-01
    • 2018-04-07
    • 2019-08-03
    • 2016-01-21
    • 2018-05-31
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    相关资源
    最近更新 更多